Ta en titt på denna koden är ni snälla

Permalänk
Medlem

Ta en titt på denna koden är ni snälla

Försöker göra ett litet program i ansi C som ska jämföra två m3u spellistor och skapa en ny fil med skillnaden mellan dem. Jag är knappast en avancerad programmerare så koden vimlar säkert av dåliga lösningar, men hur som helst har jag tre fel som jag inte förstår mig på! Kompilatorn säger rad 80, 116, 152. Testa gärna att kompilera själv.

Skulle verkligen uppskatta lite hjälp med de här tre felen!
(bekymra er inte över att kolla på resten av programmet såvida ni inte har jättemycket ork)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

char oldfilepath[99];
char newfilepath[99];
char append[450];
char index[7] = "#EXTM3U";
char oldarray[25000][300];
char newarray[25000][300];

unsigned int x=1;
unsigned int y=1;
int fr=1;
int columns;

FILE *old;
FILE *new;
FILE *output;

void readfiles(void);
void compare(void);
void out(char *append);

main()
{
system("cls");
gotoxy(2,2);
printf("This program will compare an old and a new m3u playlist, and build a new /n m3u playlist-file which is placed in the same directory as this program and named \"difference.m3u\" with \n all tracks that are missing in the old m3u file from the new one. Press spacebar to continue!");
while (getch() != ' ');
system("cls");

gotoxy(4,4);
printf("Location of old m3u file (just filename for same folder) > ");
scanf("%99s", &oldfilepath);
gotoxy(4,4);
printf("Location of new m3u file (just filename for same folder) > ");
scanf("%99s", &newfilepath);

readfiles();
compare();

if(fr==1)
{
printf("There was no difference between the playlists!");
printf("Press <spacebar> to exit...");
while (getch() != ' ');
exit(1);
}
getch();
return(0);
}

void readfiles()
{
unsigned long size;
unsigned long position=1;

gotoxy(4,4);
printf("Reading old m3u file to memory...");

if ((old=fopen(oldfilepath, "rb"))== NULL)
{
fprintf(stderr, "Could not open old m3u file!\n");
getch();
exit(1);
}
fseek(old,0,2);
size=ftell(old);

while(position < size)
{
fread(oldarray[y][x], 1, 1, old);
if(oldarray[y][x]=="\n")
{
y++;
x=0;
}
x++;
position++;
gotoxy(38,4);
printf("%ld", size-position);
}
oldarray[y][1]=EOF;

fclose(old);

gotoxy(4,5);
printf(" done. ");

gotoxy(4,4);
printf("Reading new m3u file to memory...");
gotoxy(4,5);
printf(" ");

if ((new=fopen(newfilepath, "rb"))== NULL)
{
fprintf(stderr, "Could not open new m3u file!\n");
getch();
exit(1);
}
fseek(new,0,2);
size=ftell(new);
position=1;

while(position<size)
{
fread(newarray[y][x], 1, 1, new);
if(x=="\n")
{
y++;
x=0;
}
x++;
position++;
gotoxy(38,4);
printf("%ld", size-position);
}
newarray[y][1]=EOF;
columns=(y-1);

fclose(new);

gotoxy(4,5);
printf(" done. ");
gotoxy(4,6);
printf("The program will now build a new m3u file.");
printf("Press <spacebar> to continue...");
while (getch() != ' ');
system("cls");
}

void compare()
{
int ok;

y=1;
while(newarray[y][1]!=EOF) {
ok=1;
x=1;
while((strcmp(newarray[y][], oldarray[x][]))!=0)
{
x++;
if (oldarray[1][x]==EOF)
{
ok=0;
break;
}
}

if (ok==0)
{
x=1;
while(newarray[y][x] != EOF) {
append[x] = newarray[y][x];
x++;
out(append);
}

}
y++;
gotoxy(4,4);
printf("Index: %-6d", (columns-y));
}

gotoxy(4,5);
printf("Done.");

}

void out(char *append)
{
if(fr==1)
{
output=fopen("difference.m3u", "ab");
fwrite(&index, sizeof(char), 7, output);
putc(13, output);
}

fwrite(&append, strlen(append), 1, output);
}

Permalänk
Medlem

jag orkar inte kolla igenom hela, men måste du inte ha med biblioteket "#include <iostream.h>"

Visa signatur

_________________________________________________
pattson - Min största skönhet är min Ferrari 4005WLMi =)

Permalänk
Medlem

indentering, tack

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

iostream är ju c++?
Jag testade att kompilera koden i gcc för linux, och jag fick fel på ett par ställen, men inga fel på de raderna du nämner..

m3u.c:9: warning: built-in function `index' declared as non-function m3u.c: In function `readfiles': m3u.c:77: warning: passing arg 1 of `fread' makes pointer from integer without a cast m3u.c:78: warning: comparison between pointer and integer m3u.c:113: warning: passing arg 1 of `fread' makes pointer from integer without a cast m3u.c:114: warning: comparison between pointer and integer m3u.c: In function `compare': m3u.c:149: parse error before ']' token m3u.c: At top level: m3u.c:174: parse error before numeric constant m3u.c:174: warning: data definition has no type or storage class m3u.c:175: parse error before string constant m3u.c:175: warning: conflicting types for built-in function `printf' m3u.c:175: warning: data definition has no type or storage class

Visa signatur

Äntligen har jag fått svar på om vandrande pinnar kan gäspa. Det kan de inte. Ett av världens stora mysterier är löst.

Permalänk
Medlem

Orkar inte trycka 'ändra'.

printf("This program will compare an old and a new m3u playlist, and build a new /n m3u playlist-file which is placed in the same directory as this program and named \"difference.m3u\" with \n all tracks that are missing in the old m3u file from the new one. Press spacebar to continue!");

^-- den biten, ska det inte vara "and build a new \n m3u"? Med en backslash istället? Det gör väl knappast något i koden, men det är vad jag orkade läsa ;F

Visa signatur

Äntligen har jag fått svar på om vandrande pinnar kan gäspa. Det kan de inte. Ett av världens stora mysterier är löst.

Permalänk
Medlem

Det skulle vara bra om du kunde posta felmeddelandena...

Visa signatur

War is Peace.
Freedom is Slavery.

Permalänk
Medlem

Jau, det underlättar. Och en indentering, (dvs fixa till strukturen med tabbar osv), som pattson sa, så man lättare kan kolla på koden.

Visa signatur

Äntligen har jag fått svar på om vandrande pinnar kan gäspa. Det kan de inte. Ett av världens stora mysterier är löst.

Permalänk
Medlem

Jag kanske borde säga att jag använder Borlands kompilator.

Citat:

indentering, tack

All indentering togs visst bort när jag postade koden. Bifogar som .txt istället...

När jag lade till Iostream.h fick jag bara detta felet:
Fatal F1003 C:\Program Files\BCC55\Include\stdcomp.h 5: Error directive: Must us
e C++ for STDCOMP.H
Vad kan menas med det?

Innan fick jag dessa fel:
Error E2342 1.c 78: Type mismatch in parameter '__ptr' (wanted 'void *', got 'in
t') in function readfiles
Warning W8069 1.c 79: Nonportable pointer conversion in function readfiles
Error E2342 1.c 114: Type mismatch in parameter '__ptr' (wanted 'void *', got 'i
nt') in function readfiles
Warning W8069 1.c 115: Nonportable pointer conversion in function readfiles
Error E2188 1.c 150: Expression syntax in function compare
Warning W8004 1.c 178: 'ok' is assigned a value that is never used in function c
ompare

Tack för svaren!

Permalänk
Medlem

Jag kollar bara igenom de felen du nämde (rad 80, 116, 152) lite snabbt, e inte säker på att det är rätt..

80: På rad 79 är det "\n", bör vara '\n' då det bara är ett tecken.
116: Samma fel där, det är bara ett tecken.
152: Fetjobbigt, du kan inte comparea var[a][] med var2[b][] då det är fel syntax, sista klammern kan inte vara tom på det sättet.. funderat på att loopa igenom strängen helt enkelt?

Värt att nämna är också att det är dumt att döpa variabler till saker som new, int, char och for då de används till annat.
Att ha char index[7] = "#EXTM3U"; är dumt också, det bör vara index[8] då "#EXTM3U" faktiskt är "#EXTM3U\0"

Och att du indenterar "fel", alla gör på sitt sätt, men jag har nog aldrig sätt någon som för kör ett space från funktioner och ut, sen 2 eller 3 från t.ex. for/if satser.. och varför kör du ibland
"while() { \n }" och ibland "while() \n { \n }"??

Här är hur jag hade indenterat koden (gjorde lite fixxar också):

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <iostream.h> char oldfilepath[99]; char newfilepath[99]; char append[450]; char index[8] = "#EXTM3U"; char oldarray[25000][300]; char newarray[25000][300]; int x=1; int y=1; int fr=1; int columns; FILE *old; FILE *xnew; FILE *output; void readfiles(void); void compare(void); void out(char *append); main() { system("cls"); gotoxy(2,2); printf("This program will compare an old and a new m3u playlist, and build a new \n m3u playlist-file which is placed in the same directory as this program and named \"difference.m3u\" with \n all tracks that are missing in the old m3u file from the new one. Press spacebar to continue!"); while (getch() != ' '); system("cls"); gotoxy(4,4); printf("Location of old m3u file (just filename for same folder) > "); scanf("%99s", &oldfilepath); gotoxy(4,4); printf("Location of new m3u file (just filename for same folder) > "); scanf("%99s", &newfilepath); readfiles(); compare(); if(fr==1) { printf("There was no difference between the playlists!"); printf("Press <spacebar> to exit..."); while (getch() != ' '); exit(1); } getch(); return(0); } void readfiles() { unsigned long size; unsigned long position=1; gotoxy(4,4); printf("Reading old m3u file to memory..."); if ((old=fopen(oldfilepath, "rb")) == NULL) { fprintf(stderr, "Could not open old m3u file!\n"); getch(); exit(1); } fseek(old,0,2); size=ftell(old); while(position < size) { fread(&oldarray[y][x], 1, 1, old); if(oldarray[y][x] == '\n') { y++; x=0; } x++; position++; gotoxy(38,4); printf("%ld", size-position); } oldarray[y][1] = EOF; fclose(old); gotoxy(4,5); printf(" done. "); gotoxy(4,4); printf("Reading new m3u file to memory..."); gotoxy(4,5); printf(" "); if ((xnew = fopen(newfilepath, "rb")) == NULL) { fprintf(stderr, "Could not open new m3u file!\n"); getch(); exit(1); } fseek(xnew, 0, 2); size=ftell(xnew); position=1; while(position < size) { fread(newarray[y][x], 1, 1, xnew); if(x == '\n') { y++; x=0; } x++; position++; gotoxy(38,4); printf("%ld", size-position); } newarray[y][1] = EOF; columns = (y-1); fclose(xnew); gotoxy(4,5); printf(" done. "); gotoxy(4,6); printf("The program will now build a new m3u file."); printf("Press <spacebar> to continue..."); while (getch() != ' '); system("cls"); } void compare() { int ok; y = 1; while(newarray[y][1] != EOF) { ok = 1; x = 1; while((strcmp(newarray[y][], oldarray[x][])) != 0) { x++; if(oldarray[1][x] == EOF) { ok = 0; break; } } if(ok == 0) { x = 1; while(newarray[y][x] != EOF) { append[x] = newarray[y][x]; x++; out(append); } } y++; gotoxy(4, 4); printf("Index: %-6d", (columns-y)); } gotoxy(4, 5); printf("Done."); } void out(char *append) { if(fr == 1) { output=fopen("difference.m3u", "ab"); fwrite(&index, sizeof(char), 7, output); putc(13, output); } fwrite(&append, strlen(append), 1, output); }

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

Du försöker läsa in filen till en int (*array[x][y]) men fread vill ha en minnesbuffert (en pekare). Ersätt
fread(newarray[y][x], 1, 1, new);
med
fread(&newarray[y][x], 1, 1, new);
eller
newarray[y][x] = fgetc(new);

Glöm inte att kolla efter EOF.

iostream.h (numera kallad iostream utan .h) är en C++ header. Använd inte den i C-program.

Permalänk
Medlem

En del äldre C-funktioner vill ha void* i anropen och moderna C++ kompilatorer tillåter inte implicita typkonverteringar. Ta reda på var du har felet med void* och char*.
Den första char-arrayen är 8 tecken - inte 7, glöm aldrig null-termineringen av C-strängar.

Edit:
Flåt myris. Du var snabbare på 8:an

Visa signatur

/ Assar

Permalänk
Medlem
Citat:

Fetjobbigt, du kan inte comparea var[a][] med var2[b][] då det är fel syntax, sista klammern kan inte vara tom på det sättet.. funderat på att loopa igenom strängen helt enkelt?

Mja, jag hade inte väntat mig att den biten skulle fungera, men det verkar ju inte vara det som kompilatorn klagar på. Vad jag vill göra är att jämföra strängarna som ligger vid var[a][1] och var2[b][1] med a och b konstanta men det blir väl till att skriva en loop istället.

Citat:

du indenterar "fel"

Jo jag vet... har inte orkat göra/lära mig att göra - det riktigt, sjysst att du fixade det!

Citat:

varför kör du ibland "while() { \n }" och ibland "while() \n { \n }"??

Vad menar du? Ge mig gärna ett exempel!

Citat:

Ta reda på var du har felet med void* och char*.

Det är det största problemet: det kan jag inte!

Jag skrev programmet utan tillgång till kompilator så jag kunde inte testa så det jag skrivit fungerade lite i taget, blir ju lite mer komplicerat nu.

Tack för hjälpen! Ser nästan bra ut nu

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av vG
Jo jag vet... har inte orkat göra/lära mig att göra - det riktigt, sjysst att du fixade det!

Ctrl-A sen Alt-F8, mycket trevligt med MSVC++

Citat:

Ursprungligen inskrivet av vG
Vad menar du? Ge mig gärna ett exempel!

Inget fel, men inkonsekvent, ibland skriver du while satser såhär

while(!0) { run(); Sleep(50); }

och ibland såhär

while(!0) { run(); Sleep(50); }

dvs, du har ibland '{' på samma rad som whilen (fult, hatar det) och ibland på randen efter (fint)

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

Ett tips är att låta preprocessorn ange storleken.
char foo[] = "bar"

Ska du jämföra foo[1] och bar[1] (Och hoppa över första biten), så varför inte använda strcmp() och &foo[1]? :-).

För övrigt kan jag tipsa om GCS, http://www.gnu.org/prep/standards_toc.html

Visa signatur

http://www.catb.org/~esr/faqs/smart-questions.html
"Tot kto samoiltushi infarmator tot kto sam ne ponjal sto on rasskasoval"