THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => C / C++ / C# => Topic started by: Nessa NetMonster on May 01, 2008, 20:35:02 pm



Title: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 01, 2008, 20:35:02 pm
Σε ένα πρόγραμμα που φτιάχνω, με πετάει έξω στην εντολή

if ((fpt=fopen("s1.txt","w"))==NULL){
   printf("Den anoigei to arxeio exodou.");
   exit(NULL);
}

ενώ όταν κάνω copy-paste τις ίδιες γραμμές σε καινούριο πρόγραμμα, δε μου παρουσιάζει πρόβλημα στην εκτέλεση.

Ο fpt είναι pointer σε FILE και δεν τον έχω ξαναχρησιμοποιήσει πουθενά αλλού στο πρόγραμμα. Είχα ανοιχτό ένα άλλο αρχείο με διαφορετικό pointer, αλλά το έχω κλείσει πριν φτάσει σ'αυτήν την εντολή.

Τι θα μπορούσε να του φταίει; ^idiot^


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: mademlis on May 02, 2008, 00:20:07 am
2 πιθανά προβλήματα
α) Το αρχείο αυτό ( s1.txt ) υπάρχει ήδη και είναι κλειδωμένο απο άλλη διεργασία (ή... και την ίδια)
β) Το αρχείο δν μπόρεσε να δημιουργηθεί διότι ο δίσκος είναι γεμάτος ή απαγορεύεται η εγγραφή στο σχετικό σημείο του δίσκου στο χρήστη με του οποίου τα δικαιώματα τρέχεις το πρόγραμμα.

Και στις δύο περιπτώσεις η fopen χτυπάει....


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 10:49:25 am
Δεν κατάλαβες. Οι ίδιες ακριβώς εντολές όταν τις κάνω copy-paste σε άλλο πρόγραμμα δουλεύουν.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Aurelius on May 02, 2008, 11:12:26 am
Ασχετο, αλλα σε τι compiler?


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 11:14:13 am
Turbo C.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Aurelius on May 02, 2008, 11:19:40 am
Επισης ασχετο, αν τρεξεις το project με αλλο compiler? Αφου λες οτι σε αλλο προγραμμα τρεχει.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: MARIOS on May 02, 2008, 11:21:26 am
Ίσως αυτό να εννοεί...σε άλλο compiler


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 11:29:31 am
Δε νομίζω ότι φταίει ο compiler, κάτι στο πρόγραμμα φταίει...

Πάντως το αρχείο υπάρχει και δεν έχει ξαναχρησιμοποιηθεί από το ίδιο πρόγραμμα.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Aurelius on May 02, 2008, 11:30:19 am
Ουτε και εγω το νομιζω, αλλα ποτε δεν ξερεις.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: MARIOS on May 02, 2008, 11:32:54 am
Ίσως αυτό να εννοεί...σε άλλο compiler


 ^kremala^ sorry μαλακία είπα και τώρα την κατάλαβα...
Όταν λες ότι σε άλλο πρόγραμμα τρέχει εννοείς πάντα στον Turbo C????


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 11:37:33 am
Ναι.

Θα κατεβάσω και άλλον compiler, να δούμε...


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: MARIOS on May 02, 2008, 11:39:25 am
Από  την στιγμή που στο άλλο πρόγραμμα στον ίδιο compiler είναι όλα οκ τότε το πρόβλημα είναι στο πρόγραμμα.Το υπόλοιπο πρόγραμμα όμως γιατί αυτό φαίνετε καλό...


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: MARIOS on May 02, 2008, 11:41:48 am
και μια λίγο πιο χαζή ερώτηση:
Όταν λες σε πετάει έξω?????Εννοείς ότι δουλεύει και σε πετάει λόγω εντολών????


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 11:44:22 am
Εννοώ ότι όταν φτάνει στη συγκεκριμένη εντολή μου βγάζει ένα παράθυρο με μήνυμα λάθους των windows και κλείνει ο compiler.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Aurelius on May 02, 2008, 11:58:35 am
Το s1 ειναι αρχειο που φτιαχνεις εσυ?

Αν ναι, εχεις κανει close πρωτα?


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 12:38:49 pm
Όχι, το αρχείο υπάρχει και δεν το έχω ανοίξει με κάτι άλλο.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 13:11:38 pm
Το ίδιο ακριβώς γίνεται και με το Borland... :(


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 18:42:21 pm
Λοιπόν κατάλαβα τι γίνεται, αλλά είναι πολύ παράξενο...

Βάζοντας breakpoints στις δύο εντολές μέσα στο if ανακάλυψα ότι μεταφέρεται εκεί η εκτέλεση (άρα το αρχείο δεν ανοίγει) αλλά η printf δεν εκτελείται, και η exit αντί να τερματίσει το πρόγραμμα και να με γυρίσει στον editor μου βγάζει το σφάλμα που προανέφερα...

Δε μπορώ να καταλάβω πώς γίνεται από ένα σημείο και πέρα να μην εκτελούνται οι printf :o


Title: deleted
Post by: BOBoMASTORAS on May 02, 2008, 19:14:27 pm
deleted


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 02, 2008, 19:26:52 pm
Θα ψάξω για κάποιον πιο καινούριο...

Ρε παιδιά αλλάζω διάφορα μέσα στο πρόγραμμα, άσχετα, και να ήσασταν από μια μεριά να βλέπετε τι κάνει... κάπου παραπάνω διαβάζω από ένα άλλο αρχείο με την fread, μέσα σε ένα for loop. Τη μια, η printf δούλευε πριν το loop και μετά δε δούλευε. Την άλλη, άλλαξα τον τύπο του pointer που διάβαζα από unsigned char σε signed char και η printf δούλευε κανονικά. Μετά έκανα μια αλλαγή που δε θυμάμαι τι ήταν (αλλά κάτι παρόμοιο ήταν) και διαπίστωσα έκπληκτη ότι ξαφνικά περίμενε να του δώσω τα δεδομένα από το πληκτρολόγιο αντί να τα διαβάζει από το αρχείο!

Αφού κοίταζα το help να δω μήπως είχα κάνει λάθος στη σύνταξη της fread και έβαλα τον pointer του αρχείου στη θέση του pointer της μεταβλητής και αντίστροφα! Γιατί προς στιγμήν κάτι τέτοιο νόμιζα ότι συνέβη :???:


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: mademlis on May 04, 2008, 02:30:54 am
Λοιπόν, λίγο πριν, ή λίγο μετά τον ορισμό του file pointer, κάνεις new ή malloc, ή ορίζεις μια μεταβλητή με τον Pointer της οποίας κάνεις διάφορα "καλούδια". Σε εκείνη τη μεταβλητή, είναι πολύ πιθανό να έχεις υπερβεί τα όρια, ή να έκανες αθέμιτες ενέργειες με τον pointer. Αν σου είναι εύκολο, ρίξε λίγο τον κώδικα.

Μια πολύ καλή τακτική για να λύσεις τα προβλήματα με τους pointer είναι.... η αποφυγή τους.
Αν μιλάμε για c++ ΜΕ STL, μπορείς να μην χρησιμοποιήσεις ΠΟΤΕ pointer....


Μάλλον έχεις βγει εκτός μνήμης κάπου παραπάνω στο κώδικα. Σε τόσο παλιούς compiler αν βγεις εκτός μνήμης καταλαβαίνεις το πραγματικό νόημα της έννοιας απροσδιόριστη συμπεριφορά.

Μή νομίζεις ότι και σε καινούριους δεν υπάρχουν τα προβλήματα αυτά. Πάντα, εξαρτάται απο το τι χαζομάρα κάνεις. Έχω φάει πάρα πολλές ώρες στο να λύσω προβλήματα που οφείλονταν ακριβώς σε χαζομάρες με το χειρισμό μνήμης, με 3-4 διαφορετικούς compilers. Κάθε φορά, ακόμα και σε πολύ καινούριους compilers, η συμπεριφορά ήταν απροσδιόριστη.
Χαρακτηριστικό παράδειγμα σήμερα. Προσθέταμε 1-2 χαρακτήρες σε ένα υπάρχον char *. Και ως δια μαγείας... άλλαζε τιμή μια άλλη μεταβλητή.....!!!! (σε VC 2005 compiler παρακαλώ....)


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 04, 2008, 19:40:29 pm
Η υπομονή μου τελείωσε... αν μπορείτε εσείς να μου βρείτε τι φταίει, καλώς, αλλιώς τα παρατάω ::)

Το πρόγραμμα υποτίθεται ότι ανοίγει ένα αρχείο wav και αποθηκεύει σε ένα αρχείο txt τα νούμερα (integers) που αντιστοιχούν στην κωδικοποίηση PCM. Πέρα από ένα "σουλούπωμα" στα ονόματα των μεταβλητών για να φαίνεται τι αντιπροσωπεύουν, δεν το έχω αλλάξει από προχτές.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define pi 3.14159

void main(){

   long int i,wholenum=0,formatnum=0,channels=0,fs=0,soundsize=0,ms=0,bps=0,datanum=0;
   int *soundi;
   unsigned char *k;
   signed char *soundc,*c;
   FILE *fp,*fpt;

   if ((fp=fopen("input1.wav","rb"))==NULL){
      printf("Den anoigei to arxeio eisodou.");
      exit(NULL);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
      k=c;
      wholenum+=(*k)*pow(256,i);
   }
   for (i=0;i<8;i++){
      fread(c,1,1,fp);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
      k=c;
      formatnum+=(*k)*pow(256,i);
   }
   for (i=0;i<2;i++){
      fread(c,1,1,fp);
   }
   for (i=0;i<2;i++){
      fread(c,1,1,fp);
      k=c;
      channels+=(*k)*pow(256,i);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
      k=c;
      fs+=(*k)*pow(256,i);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
      k=c;
      soundsize+=(*k)*pow(256,i);
   }
   for (i=0;i<2;i++){
      fread(c,1,1,fp);
      k=c;
      ms+=(*k)*pow(256,i);
   }
   ms=ms/channels;
   for (i=0;i<2;i++){
      fread(c,1,1,fp);
      k=c;
      bps+=(*k)*pow(256,i);
   }
   for (i=16;i<formatnum;i++){
      fread(c,1,1,fp);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
   }
   for (i=0;i<4;i++){
      fread(c,1,1,fp);
      k=c;
      datanum+=(*k)*pow(256,i);
   }
   if (ms==1){
      if ((soundc=malloc(datanum))==NULL){
         printf("Den yparxei arketh mnhmh gia ton hxo.\n");
         exit(NULL);
      }
      for (i=0;i<datanum;i++){
         fread(soundc+i,1,1,fp);
      }
   }else{
      if ((soundi=malloc(datanum))==NULL){
         printf("Den yparxei arketh mnhmh gia ton hxo.\n");
         exit(NULL);
      }
      for (i=0;i<datanum;i++){
         fread(soundc,1,1,fp);
         if (i%2)
            soundi[i/2]+=(int)256*(*soundc);
         else
            soundi[i/2]=(int)(*soundc);
      }
   }
   fclose(fp);
   fpt=fopen("sound1.txt","w");
   if (fpt==NULL){
      printf("Den anoigei to arxeio exodou.");
      exit(NULL);
   }
   for (i=0;i<ceil(datanum/2);i++){
      fprintf(fpt,"%d ",soundi[i]);
   }
   fclose(fpt);
}


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: mademlis on May 04, 2008, 20:11:36 pm
Ελα,
το λάθος είναι καραμπινάτο.....

int *soundi;
unsigned char *k;
signed char *soundc,*c;

Δύο λύσεις
Με την πρώη λύση, βγάλε όλα τα *
Aκολούθως, σε όλες τις fread, αντι για soundi, βάζεις &soundi
αντι για *k, βάεις σκέτο k

Εναλλακτικά αλλάζεις τη δήλωση ως εξής:
int soundi[1];
   unsigned char k[1];
   signed char soundc[1],c[1];

και αφήνεις το πρόγραμμα ως έχει.


Το λάθος είναι ότι ΔΕΝ είχες δεσμεύσει τη μνήμη..... ;)


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 04, 2008, 20:22:25 pm
Η πρώτη λύση απορρίπτεται, γιατί χρειάζομαι την εντολή k=c.

Κάτσε... δηλαδή μου λες ότι δε μπορώ να χρησιμοποιήσω pointers κατευθείαν; Δε δεσμεύει αυτόματα μια θέση μνήμης για 1 μεταβλητή αυτού του τύπου; :o

Μα σε όλα τα παραδείγματα του Κορτέση κατευθείαν τους χρησιμοποιούσε... :???:


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 04, 2008, 20:27:02 pm
Μπα, δε γίνεται ούτε με τη δεύτερη λύση... όταν το κάνω έτσι όπως λες μου βγάζει error στην εντολή k=c. Λέει "Lvalue required in function main".

Τα παρατάω ::)

Ευχαριστώ πάντως για τη βοήθεια.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Καμένος on May 04, 2008, 23:20:03 pm
Η πρώτη λύση απορρίπτεται, γιατί χρειάζομαι την εντολή k=c.

Κάτσε... δηλαδή μου λες ότι δε μπορώ να χρησιμοποιήσω pointers κατευθείαν; Δε δεσμεύει αυτόματα μια θέση μνήμης για 1 μεταβλητή αυτού του τύπου; :o

Μα σε όλα τα παραδείγματα του Κορτέση κατευθείαν τους χρησιμοποιούσε... :???:

Ο pointer είναι μια διεύθυνση. Όταν δηλώνεις έναν pointer δε σημαίνει ότι δεσμεύει τη μνήμη σε αυτή τη διεύθυνση.. Πρέπει να κάνεις δυναμική δέσμευση για να χρησιμοποιήσεις κάποιο χώρο μνήμης μέσω pointer..


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: marauber on May 05, 2008, 01:22:27 am
Πάντως διαβάζοντας το τόπικ, όλα αυτά μου φαίνονται τρομερά αναχρονιστικά. Γιατί να μη χρησιμοποιηθεί η C++ με την STL; Όλα αυτά τα προβλήματα δεν θα είχαν καν εμφανιστεί.


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 05, 2008, 01:59:25 am
...η ποια με την ποιά; :P :D


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Emfanever on May 05, 2008, 02:07:34 am
Έχω μια απορία. Έψαξα στο ιντερνετ αλλά δε πέτυχε τπτ.

Πώς μπορώ να καλέσω/ανοίξω ένα αρχείο .exe  μέσα από ένα πρόγραμμα C?

Κάπου διάβασα ότι γίνεται με τη system() αλλά δε τα κατάφερα... :-\

thanks


Title: Re: Πρόβλημα στο άνοιγμα αρχείου στη C
Post by: Nessa NetMonster on May 05, 2008, 13:16:29 pm
Μπα, τελικά ήταν απλό... δεν υπήρχε λάθος στους pointers, απλά προσπαθούσα να διαβάσω περισσότερα δεδομένα από όσα υπήρχαν. Αντικατέστησα την εντολή

for (i=0;i<datanum;i++){

με τις εξής

i=-1;
while(!feof(fp)){
i++;

και δούλεψε.


Title: deleted
Post by: BOBoMASTORAS on May 05, 2008, 13:30:20 pm
deleted