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