Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Speicherverwaltung Probleme

Discussion on Speicherverwaltung Probleme within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Speicherverwaltung Probleme

Moin Leute,

wir haben an der Uni jetzt mit C angefangen und ich benötige Hilfe bei einer kleinen Aufgabe. Es wäre nice wenn mir jemand per Skype helfen könnte und evtl. ein paar Fragen klären könnte. GGF. gegen kleine Bezahlung.

Die Aufgabe sind absolute Basics, also sollten kaum ein Problem für jemand von euch sein.

Grüße Alex
KwPJagTqzqC3 is offline  
Old 01/22/2017, 13:06   #2
 
chrisyou's Avatar
 
elite*gold: 103
Join Date: Jun 2009
Posts: 1,972
Received Thanks: 410
Was hält dich davon ab, die Fragen öffentlich zu posten, sodass möglist viele darauf antworten können?
chrisyou is offline  
Old 01/22/2017, 13:55   #3
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Quote:
Originally Posted by chrisyou View Post
Was hält dich davon ab, die Fragen öffentlich zu posten, sodass möglist viele darauf antworten können?
Eigentlich nichts

KwPJagTqzqC3 is offline  
Old 01/22/2017, 14:39   #4
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Ok und wie können wir dir helfen, außer die komplette Aufgabe für dich zu lösen?
Mikesch01 is offline  
Old 01/22/2017, 14:57   #5
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Quote:
Originally Posted by Mikesch01 View Post
Ok und wie können wir dir helfen, außer die komplette Aufgabe für dich zu lösen?
Das ist eine gute Frage. Ich verstehe dieses ganze System mit der Speicherreservierung nicht, also mit z.b. malloc(9) reserviere ich mir im Speicher ja 9 Werte, die nicht überschrieben werden können. Aber wie genau verwendet man die, bzw wie gehe ich damit um?

Wir hatten bisher nur Java gelernt und daher verwirrt mich das ganze in C jetzt ein wenig.

Bin ich mit sowas:
int * p = (int*)malloc(8 * sizeof(int));
Schon mal auf dem richtigen Weg?
KwPJagTqzqC3 is offline  
Old 01/22/2017, 15:06   #6
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Und jetzt lernt ihr ja eben C In deinem Skript von der Uni müsstest du ja sicherlich etwas dazu an Informationen haben.

Es gibt eine nette Dokumentation mit Beispielen. Vielleicht hilft sie dir ein bisschen:


Malloc reserviert dir einen Speicherbereich im Heap um die angegebene Anzahl an Bytes und gibt dir einen Zeiger/Pointer auf die erste Speicherstelle zurück.

Nehmen wir an, du willst 3 int Werte abspeichern. Ein int sind typischerweise 4 Byte (die tatsächliche Größe kann mittels sizeof() ermittelt werden). Nun reservierst du dir 3 * 4 Byte = 12 Byte im Heap über:
Code:
int *meineIntWerte = malloc(3 * sizeof(int)); // entspricht 3 * 4 Byte
Auf die Werte kannst du wie ein Array zugreifen. Angefangen mit dem Index 0.

Bsp:
Code:
meineIntWerte[0] = 12; // erstes int wird nun mit 12 belegt
Auslesen geht dann genauso einfach:
Code:
printf("Erstes int: %d", meineIntWerte[0]); // gibt nun 12 aus
Du kannst ja gerne noch schreiben, wo du Probleme hast, nachdem du es mal ausprobiert hast Man kann sicherlich irgendwie weiterhelfen, ohne die tatsächliche Lösung anzugeben
Mikesch01 is offline  
Thanks
1 User
Old 01/22/2017, 15:07   #7
 
chrisyou's Avatar
 
elite*gold: 103
Join Date: Jun 2009
Posts: 1,972
Received Thanks: 410
Quote:
Originally Posted by EinEpischerApfel View Post
Das ist eine gute Frage. Ich verstehe dieses ganze System mit der Speicherreservierung nicht, also mit z.b. malloc(9) reserviere ich mir im Speicher ja 9 Werte, die nicht überschrieben werden können. Aber wie genau verwendet man die, bzw wie gehe ich damit um?

Wir hatten bisher nur Java gelernt und daher verwirrt mich das ganze in C jetzt ein wenig.
Richtig, malloc() reserviert Speicher.

Dabei erwartet malloc() als Parameter den für die Variable zu reservierenden Speicherraum.
Die Funktion gibt einen Zeiger auf den reservierten Speicherraum zurück.
Da die Größe von Integern mitunter systemabhängig ist, empfiehlt sich hier das Schlüsselwort sizeOf.
Um Speicher für deine Integer zu reservieren eignet sich also:
Code:
  int* a;
  a = (int*) malloc(sizeof(int));
Das ganze lässt sich z.B. so verifizieren:
Code:
printf("%d\n",sizeof(*a));
Gibt bei mir eine Größe von 8 Byte aus.

Hast du denn mit dem eigentlichen Problem schon angefangen, zeig doch mal, was du bisher hast.
chrisyou is offline  
Thanks
1 User
Old 01/22/2017, 15:13   #8
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Danke für die beiden Antworten von euch.
Bin jetzt so weit:

PHP Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
int * array = (int*)malloc(sizeof(int));
    return 
0
    
    realloc
(array);
    
printf("Reverse vom Array ist: %d\n", array);
    
}

void realloc(int*array)
{
    
int ijlentemp;
    
i=j=len=temp=0;
    
    
     for (
i=0j=len-1i<=ji++, j--)
    {
        
temp=array[i];
        array[
i]=array[j];
        array[
j]=temp;
    }

Da fehlt aber halt noch einiges und es ist bestimmt auch noch einiges falsch. Z.b. fehlt noch, wie ich dann genau die Array Länge rausbekommen und als len abspeichere und wie ich den Speicher mit free wieder freigebe
KwPJagTqzqC3 is offline  
Old 01/22/2017, 15:26   #9
dotCom
 
Devsome's Avatar
 
elite*gold: 12400
The Black Market: 104/0/0
Join Date: Mar 2009
Posts: 15,881
Received Thanks: 4,386
Arrow General Coding -> C/C++

#moved
Devsome is offline  
Thanks
1 User
Old 01/22/2017, 15:48   #10
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Es gibt bereits eine Funktion realloc welche den Speicherbereich vergrößert bzw verkleinert. Was deine Realloc da macht verstehe ich nicht so ganz.

Realloc verwendest du z.B. so
Code:
int *arr;

// 8 elemente im array
arr = malloc(8 * sizeof(int));

// befallen
for (int i = 0; i<8; i++) arr[i] = i;

//vergrößern auf 16 elemente
arr = realloc(arr, 16 * sizeof(int));

//füllen
for (int i = 8; i<16; i++) arr[i] = i;

// alle 16 elemente ausgeben
for (int i = 0; i<16; i++) printf("%d", arr[i]);
Als Tipp, effizient wäre wenn du den Puffer immer verdoppeln würdest sobald der platz voll ist.
warfley is offline  
Old 01/22/2017, 15:51   #11
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Quote:
Originally Posted by warfley View Post
Es gibt bereits eine Funktion realloc welche den Speicherbereich vergrößert bzw verkleinert. Was deine Realloc da macht verstehe ich nicht so ganz.

Realloc verwendest du z.B. so
Code:
int *arr;

// 8 elemente im array
arr = malloc(8 * sizeof(int));

// befallen
for (int i = 0; i<8; i++) arr[i] = i;

//vergrößern auf 16 elemente
arr = realloc(arr, 16 * sizeof(int));

//füllen
for (int i = 8; i<16; i++) arr[i] = i;

// alle 16 elemente ausgeben
for (int i = 0; i<16; i++) printf("%d", arr[i]);
Als Tipp, effizient wäre wenn du den Puffer immer verdoppeln würdest sobald der platz voll ist.
Ah okay das ist praktisch, ich hab meine realloc Funktion falsch benannt. Das ist die Funktion, die das Array dann invertiert wieder ausgeben soll.
Hast du ne Idee wie ich das genau bei mir einbauen muss? Sieht bisher so aus:
PHP Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
int * array = (int*)malloc(sizeof(int));
    return 
0;

    
invert(array);
    
printf("Reverse vom Array ist: %d.\n", array);

}

void invert(int* array)
{
    
int ijlentemp;
    
i=j=len=temp=0;


     for (
i=0j=len-1i<=ji++, j--)
    {
        
temp=array[i];
        array[
i]=array[j];
        array[
j]=temp;
    }

KwPJagTqzqC3 is offline  
Old 01/22/2017, 15:59   #12
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Tag.

Mit "realloc" ist die integrierte C-Funktion gemeint:

In deinem Programm fehlt die Eingabe der Zahlen.

So könnte dein Programm grob strukturiert sein:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i;

    // Speicher anfordern
    int *array = (int*)malloc(8 * sizeof(int));
    
    // Zahlen einlesen
    /* Deine Aufgabe hier ist es die Zahlen einzulesen bis man fertig ist. 
        Die Anzahl der Eingaben kann sich über mehr als 8 int-Werte strecken 
        und somit muss der Speicherbereich deines Arrays mittels realloc 
        entsprechend erhöht werden */

    // Zahlen rückwärts ausgeben
    printf("Rückwärts: ");
    for(i = (sizeof(*array) / sizeof(int)) - 1; i >= 0; i--) { // Größe von Array geteilt int-Größe = Anzahl der Elemente im Array; 1 abgezogen wegen Array Index-Verschiebung
        printf("%d", array[i]);
    }
    printf("\n");

    // Array wieder freigeben
    free(array);
    
    return 0;
}
Mikesch01 is offline  
Old 01/22/2017, 16:00   #13
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Quote:
Originally Posted by EinEpischerApfel View Post
Ah okay das ist praktisch, ich hab meine realloc Funktion falsch benannt. Das ist die Funktion, die das Array dann invertiert wieder ausgeben soll.
Hast du ne Idee wie ich das genau bei mir einbauen muss? Sieht bisher so aus:
PHP Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    
int * array = (int*)malloc(sizeof(int));
    return 
0;

    
invert(array);
    
printf("Reverse vom Array ist: %d.\n", array);

}

void invert(int* array)
{
    
int ijlentemp;
    
i=j=len=temp=0;


     for (
i=0j=len-1i<=ji++, j--)
    {
        
temp=array[i];
        array[
i]=array[j];
        array[
j]=temp;
    }

Ja ich wüsste schon was du machen müsstest, aber damit würde ich dir ja den spaß verderben es selbst raus zu finden.

Aber soviel als tipp, ein return in der Main beendet das Programm sofort. Außerdem benötigst du am ende noch ein free um den Speicher des arrays wieder frei zu geben
Code:
 arr = malloc(...);

// Zeugs mit arr machen

// wieder freigeben
free(arr);
warfley is offline  
Old 01/22/2017, 16:24   #14
 
Beni's Avatar
 
elite*gold: 0
The Black Market: 171/0/0
Join Date: Jul 2009
Posts: 3,268
Received Thanks: 785
Noch nen Tipp: Nen Array übergibt man über den Pointer auf das erste Element(hast du schon gemacht) und als zweites gibt man die Anzahl der Elemente an, damit deine Schleife weiß, wann Schluss ist. Aktuell ist bei dir len=0 und es soll von i=0 bis len=-1 laufen... geht nicht so ganz. Sollte dir auch einige Error's throwen. Außerdem hast du keinen Prototypen deiner Funktion angegeben, was in C notwendig ist. Er kommt "von oben" nach unten und sieht "invertiere" aber hat den Funktionskopf noch nie gesehen, also weiß er (der compliler) auch nicht ob du die funktion richtig aufgerufen hast.. denke das sollte ein weiterer Fehler sein.

-> void invert(int *array, int count);

^wäre ein Beispiel für einen Prototypen. (Der kommt vor deine Main)
Beni is offline  
Thanks
1 User
Old 01/22/2017, 17:38   #15
 
KwPJagTqzqC3's Avatar
 
elite*gold: 1552
The Black Market: 169/0/0
Join Date: Apr 2014
Posts: 2,120
Received Thanks: 251
Quote:
Originally Posted by Mikesch01 View Post
Tag.

Mit "realloc" ist die integrierte C-Funktion gemeint:

In deinem Programm fehlt die Eingabe der Zahlen.

So könnte dein Programm grob strukturiert sein:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i;

    // Speicher anfordern
    int *array = (int*)malloc(8 * sizeof(int));
    
    // Zahlen einlesen
    /* Deine Aufgabe hier ist es die Zahlen einzulesen bis man fertig ist. 
        Die Anzahl der Eingaben kann sich über mehr als 8 int-Werte strecken 
        und somit muss der Speicherbereich deines Arrays mittels realloc 
        entsprechend erhöht werden */

    // Zahlen rückwärts ausgeben
    printf("Rückwärts: ");
    for(i = (sizeof(*array) / sizeof(int)) - 1; i >= 0; i--) { // Größe von Array geteilt int-Größe = Anzahl der Elemente im Array; 1 abgezogen wegen Array Index-Verschiebung
        printf("%d", array[i]);
    }
    printf("\n");

    // Array wieder freigeben
    free(array);
    
    return 0;
}
Okay den Teil in der Mitte sollte ich hinkriegen, ich schau mal

Edit:
In Java bswp. würde ich das halt irgendwie so lösen: while (!StdIn.IsEmpty).....
Gibts da eine ähnliche Funktion zu auch in C?
KwPJagTqzqC3 is offline  
Reply


Similar Threads Similar Threads
Speicherverwaltung - Paging
11/27/2013 - General Coding - 5 Replies
Hey Community, Ich hätte da mal ein paar fragen zur Speicherwerwaltung des Hauptspeichers/RAM (Bitte nur Leute antworten die ahnung davon haben!!) Gegeben Sei ein Hauptspeicher mit max. größe von 4GB. Eine Seite in diesem Speicher ist 32KB groß. Ich weiß das 2^31 bits zur adressierung benötigt werden und ich 131072 Speicherseiten habe. Meine frage ist Wie groß kann ein eintrag in der Seitentabelle? Wie Groß ist die Seitentabelle
[Sammelthread]Ep2 Linux Probleme/Hilfe/Antworten-Server Probleme
06/21/2013 - Last Chaos Private Server - 11 Replies
In den Letzten Tagen hab ich öfter mal immer neue Threads gesehen, wo es um Linux geht oder um Server Probleme... Da dachte ich mir wieso kein Sammelthread?! Wenn es unnütz ist kann er gerne wieder geschlossen werden :) Aber denke mal, was wäre eine Art um nicht so viele Threads zu öffnen und wo man schnell andere antwortet nach gucken könnte.(ps.ich meins nur gut:) ) Mfg.Mango?! Thread zu den Ep2 Files
Probleme mit dem Internet(Laggs, Ping und Latenz probleme)
10/09/2012 - Technical Support - 4 Replies
Hallo, ich hofff ich bin hier richtig. Mein Problem ist, dass ich Probleme mit der Internetverbindung habe. Angefangen hat es bei Diablo 3 mit Latenzproblemen, wo ich dann nach paar Minuten bei ner Latenz von mehreren 1000 ms rausgeschmissen wurde. Danach hat es bei Gohst Recon Online funkioniert lagg frei und dann aber auch mit Laggs. Und jetzt bei LOL ist, muss alle paar 10 sek die Verbindung wiederhergestellt werden. Anfangs bei LOL hab ich den besten Ping und es scheint die...
Minecraft Probleme ( Ruckel-, Grafik- und/oder Lag- Probleme
09/10/2011 - Minecraft - 3 Replies
So, es ist das: Und zwar geh ich gleih zum Punkt, mein Minecraft ruckelt alle 5-6 sec. . Und wenn ich denn "F3" drücke, kommt doch (glaub ich wenn das das ist) dieser Debug modus, steht / ist ein Bild wo es die Verbindung oder wie das Spiel grad läuft, an. Hier ein Screenshot: was los ist: http://imageshack.us/photo/my-images/850/20110910 205313.png/ an den immerwieder gleichmäßigen roten linien die oben aufkommen.



All times are GMT +2. The time now is 03:43.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.