iphpbb - Forenarchiv: Archivbeitrag des Forums Tutorials.at
Verfügbare Informationen zu "Malloc Verständnisproblem Teil 2 !"

  • Qualität des Beitrags:
  • Beteiligte Poster: Zuul
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 2
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Malloc Verständnisproblem Teil 2 !
  • Letzte Antwort: vor 1 Jahr, 9 Monaten, 5 Tagen, 8 Stunden, 7 Minuten
Alle Beiträge und Antworten
Zuul - 10.01.2007, 13:16
Malloc Verständnisproblem Teil 2 !
Hey ;)

Nachdem ihr mir hier so grandios weiter geholfn habt und ich immer noch dezente schwierigkeiten habe bitte ich euch nun erneut um eure hilfe ... ausserdem bitte ich um entschuldigung, da der folgende code relativ lang ist ;)

Code: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Zeilenlange 100

int vergleich(const void **Var1,const void **Var2);
int allocn(char Dateiname[]);

int vergleich(const void **Var1,const void **Var2)
{
   return strcmp(*(char**)Var1,*(char**)Var2);
}

int allocn(char Dateiname[])
{
   int wortanz=0,wortlang,i=0,j=0;
   char Zwischenspeicher[Zeilenlange];
   FILE *datei;
   char* zwischen=NULL;
   char* pcPointer=NULL;
   
   datei=fopen(Dateiname, "r");                           /*Datei Öffnen*/
   if(datei==NULL)
   {
      fprintf(stderr, "Konnte die Datei, %s, nicht finden.\n",Dateiname);   
      return EXIT_FAILURE;            
   }

   while(fgets(Zwischenspeicher,Zeilenlange,datei))            /*Wörter in Zwischenspeicher schreiben*/
   {
      wortanz++;
      printf("%s",Zwischenspeicher);
   }
   rewind(datei);                                       /* Datei wieder an den Anfang setzen*/
   
   pcPointer=(char*)malloc(wortanz*sizeof(char*));               /* Erstellen einer Wortliste */
   if(pcPointer==NULL)
   {
      printf("Konnte nicht allokieren.\n");
   }
   j=0;                                             /* Zähler für die Wortliste */
   while(fgets(Zwischenspeicher,Zeilenlange,datei))            /* Wörter in einen Zwischenspeicher kopiern */
   {
      for(i=0;i<sizeof(Zwischenspeicher);i++)
      {
         if(Zwischenspeicher[i]=='\n')
         {
            Zwischenspeicher[i]='\0';
            break;
         }
      }            
   
      wortlang=strlen(Zwischenspeicher);   
      zwischen=(char*)malloc(wortlang*sizeof(char));
      
      if(zwischen==NULL)
      {
         printf("Konnte Wort nicht anlegen.\n");
         return EXIT_FAILURE;
      }
   
      *(pcPointer+j)=(char)zwischen;
      j++;
      for(i=0;i<wortlang;i++)
      {
         *(zwischen+i)=Zwischenspeicher[i];
      }      
   }
//----------Funktioniert nicht, wirft Speicherfehler------------
//   qsort(pcPointer,wortanz,sizeof(char*),vergleich);                     /* Sortieren*/   
//   for(j=0;j<wortanz;j++)
//   {
//      printf("Nr:%d, %s\n",j,pcPointer[j]);                           /*Ausgabe*/
//   }
//--------------------------------------------------------------
   fclose(datei);
   free(pcPointer);
   free(zwischen);
   printf("------------------------------------------------------------------------------\n");
   return EXIT_SUCCESS;
}



int main(int argc,char *argv[])
{
      
   int laufvariable=1;

   printf("Ihre angegebenen Dateinamen: ");
   for(laufvariable;laufvariable<argc;laufvariable++)
   {
      if(argv[laufvariable] != NULL)
      {
         printf("%s, ",argv[laufvariable]);
         allocn(argv[laufvariable]);
      }
      if(argv[laufvariable]==NULL)
      {         
         break;
      }
   }
      
   
   if(argv[1]==NULL)                                          /*Fehler Abfangen*/
   {
      printf("Kein Parameter angegeben! Programm bitte aus der CMD starten!");                           
   }
   getchar();
   return 0;


}


Ich habe mich wirklich bemüht den fehler zu finden und auch meine kollegen um hilfe gebeten, doch die wusstn leider auch nicht woran genau es scheitert ...

Im Kommentar steht, wo der fehler entsteht, habs mal ausgeklammert, damits zum compiliern geht ...


auszuführen is es wie man sieht über die CMD

wir habn dafür 3 datein ( wortliste_bio.txt, wortliste_deutsch.txt, wortliste_jargon.txt) die werd ich euch allerdings nicht aufbrummen, schreibt einfach eine txt datei mit 3 oder 4 wörtern die nicht sortiert sind das sollte zu testzwecken vorerst reichen :)


Vielen Dank im vorraus
mfg
Zuul
Zuul - 10.01.2007, 14:33

... ok ... durch glückliche fügungen hat sichs schon aufgeklärt ^^


falls es jemanden intressiert .. hier der funktionierende code ; )


Code: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Zeilenlange 100

int vergleich(const void **Var1,const void **Var2);
int allocn(char Dateiname[]);

int vergleich(const void **Var1,const void **Var2)
{
   return strcmp(*(char**)Var1,*(char**)Var2);
}

int allocn(char Dateiname[])
{
   int wortanz=0,wortlang,i=0,j=0;
   char Zwischenspeicher[Zeilenlange];
   FILE *datei;
   char* zwischen=NULL;
   int* pcPointer=NULL;
   int c;

   datei=fopen(Dateiname, "r");                           /*Datei Öffnen*/
   if(datei==NULL)
   {
      fprintf(stderr, "Konnte die Datei, %s, nicht finden.\n",Dateiname);   
      return EXIT_FAILURE;            
   }

   while(fgets(Zwischenspeicher,Zeilenlange,datei))            /*Wörter in Zwischenspeicher schreiben*/
   {
      wortanz++;
      printf("%s",Zwischenspeicher);
   }
   rewind(datei);                                       /* Datei wieder an den Anfang setzen*/
   
   pcPointer=(char*)malloc(wortanz*sizeof(char*));               /* Erstellen einer Wortliste */
   if(pcPointer==NULL)
   {
      printf("Konnte nicht allokieren.\n");
   }
   j=0;                                             /* Zähler für die Wortliste */
   while(fgets(Zwischenspeicher,Zeilenlange,datei))            /* Wörter in einen Zwischenspeicher kopiern */
   {
      for(i=0;i<sizeof(Zwischenspeicher);i++)
      {
         if(Zwischenspeicher[i]=='\n')
         {
            Zwischenspeicher[i]='\0';
            break;
         }
      }            
   
      wortlang=strlen(Zwischenspeicher)+1;   
      zwischen=(char*)malloc(wortlang*sizeof(char));
      
      if(zwischen==NULL)
      {
         printf("Konnte Wort nicht anlegen.\n");
         return EXIT_FAILURE;
      }
   
      *(pcPointer+j)=(int)zwischen;
      j++;
            
   
   
   for(i=0;i<wortlang;i++)
      {
         *(zwischen+i)=Zwischenspeicher[i];
      }
   }
   for (c=0;c<wortanz;c++)
   {
      printf("%d %s\n",c,(pcPointer[c]));
   }
   qsort(pcPointer,wortanz,sizeof(int*),vergleich);                     /* Sortieren*/   
   for(j=0;j<wortanz;j++)
   {
      printf("Nr:%d, %s\n",j,pcPointer[j]);                           /*Ausgabe*/
   }

   fclose(datei);
   free(pcPointer);
   free(zwischen);
   printf("------------------------------------------------------------------------------\n");
   return EXIT_SUCCESS;
}



int main(int argc,char *argv[])
{
      
   int laufvariable=1;

   printf("Ihre angegebenen Dateinamen: ");
   for(laufvariable;laufvariable<argc;laufvariable++)
   {
      if(argv[laufvariable] != NULL)
      {
         printf("%s, ",argv[laufvariable]);
         allocn(argv[laufvariable]);
      }
      if(argv[laufvariable]==NULL)
      {         
         break;
      }
   }
      
   
   if(argv[1]==NULL)                                          /*Fehler Abfangen*/
   {
      printf("Kein Parameter angegeben! Programm bitte aus der CMD starten!");                           
   }
   getchar();
   return 0;


}



mfg
Zuul
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken
Weitere Beiträge aus diesem Forum
OpenGl Tutorial - gepostet von c# am Dienstag 26.06.2007
Units - gepostet von C+++ am Montag 29.01.2007
Männlich- Weiblich zeichen - gepostet von DrPhil_Guth am Sonntag 23.04.2006
Knifflige fehler im kleinem programm - gepostet von aimheld am Samstag 23.09.2006
Leerzeichen lesen - gepostet von detewe89 am Donnerstag 31.05.2007
Befehle / Funktionen - gepostet von Walgo am Mittwoch 18.07.2007
Textdatei bearbeiten - gepostet von tarzipan7 am Dienstag 20.11.2007
Ähnliche Beiträge
!!Where did you sleep last night!! ~Teil 2~ - soOkie (Montag 22.05.2006)
Wettbewerb Teil 12 FAMOUS - Julia (Donnerstag 07.09.2006)
Shoutbox im unterem Teil des Boards - Gaggo (Dienstag 06.06.2006)
There and back again...Teil 1 - Sir Harold (Freitag 14.04.2006)
Chat, teil 2 - apocalypto (Montag 02.07.2007)