per ptr übergebenes 2dim char array wird bei funktionsende "weggeworfen"

Biergamasda

Erfahrenes Mitglied
Hi Leutz, ich glaube, ich verzweifle :)
weis nicht mehr was ich tun soll, vl kann mir ja jemand helfen :)

also

der Funktionskopf
C:
int readFile(char **NameList);

dieser Funktion übergebe ich folgendes Array
C:
char **NameList = NULL;

der Funktionsaufruf
C:
lenCount = readFile(NameList);

und die Funktion herself :)
C:
int readFile(char **NameList)
{
    FILE *fpRead;
    char buffer = '\n';
    int lenCount = 0,charCount = 0;
    if(fpRead = fopen("NameList.txt","r"))
    {
        do
        {
            
            if(lenCount == 0)
                NameList = (char**)malloc(sizeof(char*));
            else
                NameList = (char**)realloc(NameList,(lenCount+1) * sizeof(char*));


            charCount = 0;
            while(buffer != '\0')
            {
                buffer = fgetc(fpRead);                
                if(feof(fpRead) || buffer == '\n')
                    buffer = '\0';

                if(charCount == 0)
                    NameList[lenCount] = (char*)malloc(sizeof(char));
                else                
                    NameList[lenCount] = (char*)realloc(NameList[lenCount],(charCount+1) * sizeof(char));

                NameList[lenCount][charCount] = buffer;
                charCount++;
            }
            buffer = -1;
            lenCount++;
        }while(!feof(fpRead));
    }
    else
    {
        cout << "can't read file";
        return -1;
    }
    fclose(fpRead);
    return lenCount;    
}

währ nett wen mir jemand helfen könnte

in der Funktion ist meines Wissens kein Fehler, da sie vom Prinzip her ident, ohne Funktion schon funktioniert hat, als ich den Code dann der Übersicht halber in ner Funktion verstaut habe, ist der wert der in NameList steht, nicht mehr vorhanden

Hoffe auf eine baldige Antwort

lg Masda
 
Hallo,

Ich kann jetzt nur raten, da ich dein Problem nicht kenne da du nichts dazu gesagt hast...

Code:
int readFile(char **NameList);
Code:
char **NameList = NULL;
Code:
lenCount = readFile(NameList);

Wenn du erwartest das in NameList nach dem Aufruf was drin steht geht das nicht so, da
der Pointer Call by Value übergeben wird.

Du hast 2 Möglichkeiten:

1.) Du allokierst vor dem Aufruf schon Speicher für NameList und arbeitest in
der Funktion readFile mit strcpy oder what ever.

Oder:
2.) Du machst es so:
Code:
int readFile(char ***NameList); 
...
char **NameList = NULL; 
lenCount = readFile(&NameList);

//edit: Sorry hab übersehen das du deine Problembeschreibung im Titel untergebracht hast :)

Gruß

RedWing
 
Zuletzt bearbeitet:
kein Problem, is ja leicht zu übersehen :D

wenn ichs per Lösung 2 mache, muss ich in der Funktion so arbeiten, als ob ich einen pointer auf mein 2 dimm array habe, sprich "fast" überall noch nen stern dazu? :)

lg

PS:
ginge das per Referenz übergabe auch?
 
Hallo,

in C gibt es kein Call by Reference. Wenn du mit C++ arbeitest koenntest dus so machen:
Code:
#include <iostream>

using namespace std;

int foo(char*& buf){
    buf = new char[10];
    strcpy(buf, "Test");
}
int main(){
    char* res = NULL;
    foo(res);
    cout << res << endl;
    delete[] res;
}

Zu deiner ersten Frage:

Du musst immer einmal dereferenzieren, sprich immer einen * vor NameList in deiner
Funktion readFile schreiben wenn du mit dem Pointer auf dein 2 Dimensionales
Charachter Array zugreifen möchtest.

Ich finde aber die Variante wo sich der Aufrufer deiner Funktion vorher selber um die
Speicheralloziierung kümmern muss IMHO besser, da so eventuelle Speicher Leaks
vermeidet werden, da wenn er selber vor dem Aufruf deiner Funktion readFile Speicher
allokiert hat weiß er das er diesen auch selber wieder Freigeben muss. Bei der anderen Variante entsteht nur
Verwirrung

Gruß

RedWing
 
Zuletzt bearbeitet:
ich habe es extra so gemacht, dass der Speicher beim Lesen dynamisch allociert wird, da die File- und Zeilenlänge variabel ist.

Es geht darum, zB die Namen in einem Telefonbuch zu hashen und die Kollissionen per double Hashing zu behandeln, demnach können es sozusagen endlos viele Namen sein, und da ist es dann nicht gerade empfehlenswert, ein Array mit 2Mrd möglichen Namen einzubauen wenn man zB nur 1Mrd braucht ;)

habs jetzt per Referenz gemacht und es geht :)
hab mich deshalb für referenz entschieden, da ich bei folgender Zeile eine Access violation bekam :)

*NameList[lenCount][charCount] = buffer;


lg und danke
Masda
 
Biergamasda hat gesagt.:
--snip--
habs jetzt per Referenz gemacht und es geht :)
hab mich deshalb für referenz entschieden, da ich bei folgender Zeile eine Access violation bekam :)

*NameList[lenCount][charCount] = buffer;
--snip---

Vorrausgesetzt du hast für deine NameList schon Speicher alloziiert muesstest du es
eventuell klammern:
Ich denke so sollte es funktionieren:
Code:
(*NameList)[lenCount][charCount] = buffer;

Gruß

RedWing
 
Zurück