tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
487
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Biergamasda
    Biergamasda Biergamasda ist offline Mitglied Brokat
    Registriert seit
    Feb 2005
    Beiträge
    373
    Hi Leutz, ich glaube, ich verzweifle
    weis nicht mehr was ich tun soll, vl kann mir ja jemand helfen

    also

    der Funktionskopf
    Code c:
    1
    
    int readFile(char **NameList);

    dieser Funktion übergebe ich folgendes Array
    Code c:
    1
    
    char **NameList = NULL;

    der Funktionsaufruf
    Code c:
    1
    
    lenCount = readFile(NameList);

    und die Funktion herself
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    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
     

  2. #2
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

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

    Code :
    1
    
    int readFile(char **NameList);
    Code :
    1
    
    char **NameList = NULL;
    Code :
    1
    
    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 :
    1
    2
    3
    4
    
    int readFile(char ***NameList); 
    ...
    char **NameList = NULL; 
    lenCount = readFile(&NameList);

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

    Gruß

    RedWing
    Geändert von RedWing (04.03.06 um 16:41 Uhr)
     
    "I'm not deaf, I'm ignoring you"
    ----

  3. #3
    Avatar von Biergamasda
    Biergamasda Biergamasda ist offline Mitglied Brokat
    Registriert seit
    Feb 2005
    Beiträge
    373
    kein Problem, is ja leicht zu übersehen

    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?
     

  4. #4
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

    in C gibt es kein Call by Reference. Wenn du mit C++ arbeitest koenntest dus so machen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #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
    Geändert von RedWing (04.03.06 um 17:01 Uhr)
     
    "I'm not deaf, I'm ignoring you"
    ----

  5. #5
    Avatar von Biergamasda
    Biergamasda Biergamasda ist offline Mitglied Brokat
    Registriert seit
    Feb 2005
    Beiträge
    373
    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
     

  6. #6
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Zitat Zitat von Biergamasda
    --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 :
    1
    
    (*NameList)[lenCount][charCount] = buffer;

    Gruß

    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 05.04.10, 23:31
  2. Array wird "nicht richtig" ausgegeben
    Von Gifty43 im Forum PHP
    Antworten: 4
    Letzter Beitrag: 29.04.07, 11:23
  3. array wird als "Array" ausgegeben
    Von Aser im Forum PHP
    Antworten: 4
    Letzter Beitrag: 08.11.04, 17:21
  4. char-Array "transformieren"
    Von lindin im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 13.09.04, 20:24
  5. In Adressleiste übergebenes "+" auslesen
    Von deb_ugger im Forum PHP
    Antworten: 1
    Letzter Beitrag: 26.08.04, 16:36