Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2D Array Heap Speicher

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.10.2004, 16:02 Uhr
~Fox
Gast


Also ich habe ein 2D Heap array:


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
char *diffremoved=strdup ("diff file1.txt file2.txt | egrep '<'");

FILE *remove;
remove = popen (diffremoved,"r");

    /*if (!remove = popen (diffremoved,"r"))
    {
    perror ("");
    exit (EXIT_FAILURE);
    return EXIT_FAILURE;
    }*/

    
char **removef;
char tmp;
char tmp2;
int x = 0;
int y = 0;

//*removef = realloc (removef, sizeof (char));

    while (!feof (remove))
    {
    tmp = fgetc (remove);
        if (tmp == '<' && (tmp2 = fgetc (remove)) == ' ')
        {
        }
        
        else
        {
        if (tmp2 == '\n')
        {
                realloc (removef, sizeof (removef [0]));
        x++;
        y = 0;
        }
        else
        {
            realloc (*removef, sizeof (char));
            removef [x] [y] = tmp;
            y++;
        }
        }
        
    }
    
    int z = 0;
    while (z <= (sizeof (removef)/sizeof (removef [0])))
    {
    printf ("%s\n",removef[z]);
    z++;
    }
    
    return 0;

}


Naja ich versuche eine Datei (FILE Stream von popen) einzulesen per fgetc. Naja ich weis ja nicht wie groß eine Zeile ist und wie viele Zeilen es gibt, also versuche ich den Array dynamisch zu erweitern (wobei ich das < Zeichen auslasse). Aber es klappt nicht so wie ich mir das vorgestellt hatte.

Dieser Post wurde am 27.10.2004 um 16:03 Uhr von Fox editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.10.2004, 19:30 Uhr
~Fox
Gast


No idea?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.10.2004, 20:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


was für nen fehler gibts denn? evtl musste zuerst malloc am anfang machen, damit man realloc nutzen kann
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.10.2004, 14:45 Uhr
~Fox
Gast


Es gibt einen Speicherzugriffsfehler!

Mit malloc das gleiche:


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
char *diffremoved=strdup ("diff file1.txt file2.txt | egrep '<' ");

FILE *remove;
remove = popen (diffremoved,"r");

    /*if (!remove = popen (diffremoved,"r"))
    {
    perror ("");
    exit (EXIT_FAILURE);
    return EXIT_FAILURE;
    }*/

    
char **removef;
char tmp;
char tmp2;
int x = 0;
int y = 0;
removef = (char *) malloc (sizeof (char));

    while (!feof (remove))
    {
    tmp = fgetc (remove);
        if (tmp == '<' && (tmp2 = fgetc (remove)) == ' ')
        {
        }
        
        else
        {
            if (tmp2 == '\n')
            {
            realloc (removef, sizeof (removef [0]));
            x++;
            y = 0;
            }
            else
            {
            realloc (*removef, sizeof (char));
            removef [x] [y] = tmp;
            y++;
            }
        }
        
    }
    
    int z = 0;
    while (z <= (sizeof (removef)/sizeof (removef [0])))
    {
    printf ("%s\n",removef[z]);
    z++;
    }
    
    return 0;

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.10.2004, 15:15 Uhr
ao

(Operator)


Das ist ein ziemliches Gehampel mit char, char* und char**, da kommt man leicht bei ins Schwimmen.

Kannst du nicht erst mal ein char szLine [1024] machen und da ne ganze Zeile reinlesen, mit fgets? Damit erst mal dein Algorithmus ans Rennen kommt?

Für diese Operationen am offenen Herzen (mit Doppelpointer und realloc) wärs gut, wenn das drumherum halbwegs erprobt wäre.

Machst du das eigentlich im Debugger, oder startest du dein Programm und wartest ab, was passiert?

Übrigens scheinen da noch einige Missverständnisse vorzuliegen:

sizeof (char) ist immer 1, das malloc-Statement holt also genau 1 Byte Speicher, willst du das wirklich?

sizeof (removef [0]) bestimmt nicht etwa die Länge eines Strings, dafür gibts strlen(), sondern liefert nur die Größe von removef[0] im Speicher. removef[0] ist ein char*, und die Größe davon ist auf den meisten Systemen 4.

Und das hier: sizeof (removef)/sizeof (removef [0]) macht vermutlich auch nicht das, was du erwartest, das ist nämlich sizeof (char**) / sizeof (char*), und das ist immer 1.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.10.2004, 15:48 Uhr
~Fox
Gast


Naja den Algo hab ich schon mit einem 10000 * 10000 Array getestet. Bloß das andere funktioniert nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.10.2004, 16:11 Uhr
~Fox
Gast


Naja der Debugger meint, es liege an folgender Zeile:

C++:
removef [x] [y] = tmp;



Naja x und y sind = 0.

Es scheint der Speicher wird nicht reserviert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.10.2004, 17:21 Uhr
~Fox
Gast


So ich habs:


C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
char *diffremoved=strdup ("diff file1.txt file2.txt | egrep '<' ");

FILE *remove;
remove = popen (diffremoved,"r");

    /*if (!remove = popen (diffremoved,"r"))
    {
    perror ("");
    exit (EXIT_FAILURE);
    return EXIT_FAILURE;
    }*/

    
char **removef;
char tmp;
char tmp2;
int x = 0;
int y = 0;
removef = malloc (sizeof (char*));
removef [0] = malloc (sizeof (char));

    while (!feof (remove))
    {
    tmp = fgetc (remove);

            if (tmp == 10)
            {
            x++;
            removef [x] = malloc (sizeof (char*));
            y = 0;
            }
            else
            {
            realloc (removef [x], sizeof (char));
            removef [x][y] = tmp;
            printf ("%d %d %c\n",x,y,tmp);
            y++;
            }
    };
    
    int z = 0;
    while (z <= x)
    {
    printf ("%s\n",removef[z]);
    z++;
    }
    
    return 0;

}


Es wird bloß immer eine Zeile zuviel eingelesen. Woran liegt das?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: