Προς το περιεχόμενο

C/C++: giati ena char array den doulevei me to %s otan einai global?


Stilewag

Προτεινόμενες αναρτήσεις

Δημοσ.

giati ena char array den doulevei me to %s otan einai global?

 

ena paradeigma.

 

To parakatw programma doulevei mia xara:

 

#include <stdio.h>

 

void main(void)

{

unsigned char Word[4];

 

Word[1] = 'a';

Word[2] = 'b';

Word[3] = 'c';

 

printf("%s", Word);

}

 

To parakatw programa den doulevei!:

 

#include <stdio.h>

 

unsigned char Word[4];

 

void main(void)

{

 

Word[1] = 'a';

Word[2] = 'b';

Word[3] = 'c';

 

printf("%s", Word);

}

 

 

Mou einai aparetito o char array Word[] na einai global. Iparxei topos?

Δημοσ.

Το λάθος και στους δύο κώδικες είναι ότι τα στοιχεία αριθμούνται από το 0, όχι από το 1.

Επίσης πρέπει να ΣΙΓΟΥΡΕΥΤΕΙΣ ότι το τελευταίο στοιχείο του array θα είναι το '\0', γιατί αλλιώς το πρόγραμμά σου μπορεί να κολλάει.

Δηλαδή βάλε

Word[0] = 'a';

Word[1] = 'b';

Word[2] = 'c';

Word[3] = '\0';

 

Τέλος, το τελευταίο bug είναι η υπογραφή σου :-) Δεν δουλεύει σωστά!

Δημοσ.

let me guess... σου βγάζει "segmentation fault".

 

Κάθε string (που σέβεται τον εαυτό του) πρέπει να τελειώνει με το '\0' διαφορετικά δεν είσαι εξασφαλισμένος (=προβλήματα κατά τον χειρισμό του).

 

k thnx bye :P

Δημοσ.

nai. einai mia kaki sinitheia na ksekinaw apo to 1

 

gia afto ton logo, ef'oson thelw na exw 1-3 vazw array length 4. It this ok? ... diladi sto OneWord[1] den exei kataxerithei tipota

Δημοσ.

i arithmisi ksekinaei apo 0. Se ena toso aplo programma isws na min kanei diafora, alla etsi k alliws gia poio logo na mi to kaneis alliws? Giati na dimiourgeis mia thesi parapanw kai na min tin xrisimopoieis? Vazeis enan arithmo mikrotero :).

Δημοσ.

einai thema sinitheias. Isws argotera to diorthosw.

 

Episeis.. to programma den kolaei an den valw \0 apla prepei na valw oposdipote OneWord[k] dioti alliws vgazei "kinezika" ascii. To volepsa. Afou kanei compile ti provlima iparxei? einai kako 1 thesi se 3 arrays pou menoun anekmetaleftes?

Δημοσ.
einai thema sinitheias. Isws argotera to diorthosw.

Είναι λάθος διότι σε μια έκφραση του style printf("%s\n",word) του λες να ξεκινήσει από την διεύθυνση του word ενώ εσύ έβαλες το πρώτο στοιχείο στην διεύθυνση word+1 (αφού μιλάμε για chars και κάθε char είναι 1byte).

 

Επίσης αυτό με το '\0' είναι πολυ σημαντικό. Μπορώ να σου στείλω κώδικα (απλό) αν και μπορείς να το καταλάβεις και μόνος σου, που χωρίς το '\0' ο χειρισμός ενός string συνεχίζει και σε κομμάτια μνήμης που δεν θα έπρεπε και καταλήγει (ή όχι) σε address violation error (γνωστό και ως segmentation fault).

Δημοσ.

@Stilewag: Είναι όπως σου τα λένε τα παιδιά. Για να βοηθήσω λίγο (αφού βλέπω ότι η "μητρική" σου γλώσσα είναι μάλλον η Pascal):

 

Οταν ορίζουμε μια μεταβλητή string[N] στην (Borland/Turbo) Pascal, ορίζουμε στην πραγματικότητα ένα array[0..N] όπου Ν το μέγιστο μήκος του string.

Αν υποθέσουμε ότι το string είναι κενό (s:=''"; ) και εκτελέσουμε την καταχώρηση s:=s+'ABC'; (κάτι τέτοιο έκανες σε προηγούμενο μήνυμά σου, στην ουσία αυτό που συμβαίνει είναι: s[1]:='A'; s[2]:='B'; s[3]:='C'; αλλά επίσης και s[0]:=chr(3); δηλαδή στη θέση '0' του πίνακα καταχωρείται το ενεργό μήκος του string με τη μορφή του χαρακτήρα που έχει ASCII=3.

Αν π.χ. έκανες την καταχώρηση s:='insomnia'; το s[0] θα γινόταν chr(8 ) κοκ.

Οταν τώρα καλείς μια διαδικασία της Pascal με παράμετρο string, για παράδειγμα writeln(s), αυτό ισοδυναμεί με for i:=1 to ord(s[0]) do write(s); κλπ.

 

Αντίθετα στη C/C++, για το ίδιο string οι καταχωρήσεις όπως γράφηκε παραπάνω θα είναι s[0]='A'; s[1]='B'; s[2]='C'; s[3]='\0'; και η printf(%s,...) ή η puts(s) μεταφράζεται σαν for(i=0;s!='\0';i++) printf("%c", s); κλπ. (Για να μιλήσουμε με όρους Pascal, αυτό είναι καθαρόαιμο while και όχι for).

 

Οπως λοιπόν γράφουν και οι φίλοι πιό πάνω, ούτε τον ASCII=0 μπορούμε ν' αγνοούμε στην τελευταία θέση (οι ρουτίνες χειρισμού strings θα εκτελέσουν ένα ... while που θα πάρει τη μνήμη παραμάζωμα -κι όποιον πάρει ο χάρος) ούτε να αδιαφορήσουμε για τον χαρακτήρα της θέσης [0]. Αν εκεί βρίσκεται π.χ. ο χαρακτήρας με ASCII=12 θα εισπράξουμε ένα ωραιότατο clear screen ή σε μια εκτύπωση μια αλλαγή σελίδας.

 

Hope it helps (και συγγνώμη αν κάποιοι θεωρούν το κείμενο αυτό off topic)

Δημοσ.

Episis afto pou ego thelo na sou pw einai oti eite eisai sinithismenos eite oxi an theleis na asxolitheis me mia glossa tote prepei na allakseis tis sinitheies sou kai na matheis tous kanones aftis tis glossas.

Δημοσ.

@Legionnaire, gerontas:

 

Afto me tin "mnimi paramazoma" me tarakounise. Diladi giafto otan tou elega printf("%s") mou evgaze kai alla ASCII :-| profanws pernage se alles topothesies tis mnimis

 

@gerontas:

 

Efxaristw pou mpikes ston kopo na mou to eksigiseis me tosi leptomeria. Afto me to "for tis C pou leitourgei san "while" tis Pascall itan afto pou me diskolepse (kai akoma me diskolevei ligo) otan pernaga apo Pascall se C. Kai esena einai i Pascall i "mitriki" sou? :)

 

@SoPTeP: .. :-/ exeis dikaio. Prepei na "simperiferomaste" opws orizei i glwssa kai oxi opws exoume mathei apo tin proigoumeni. Tha me kathisterisei ligo se afto pou etoimazw, alla mallon einai i sofoteri epilogi.

 

---

 

Tha tin psaksw tin douleia. Pantws i C vgazei genika (kai eidika) perisotero noima apo tin Pascall, einai pio sinoptiki, pio evelikti, alla mporei na peseis se lathi (px na iparveis ta oria enos array).

Δημοσ.
@gerontas:

 

Efxaristw pou mpikes ston kopo na mou to eksigiseis me tosi leptomeria. Afto me to "for tis C pou leitourgei san "while" tis Pascall itan afto pou me diskolepse (kai akoma me diskolevei ligo) otan pernaga apo Pascall se C. Kai esena einai i Pascall i "mitriki" sou? :)

Δεν χρειάζονται ευχαριστίες, έχουμε ξαναπεί ότι εδώ είμαστε για να βοηθάμε ο ένας τον άλλον.

Χαίρομαι, αν ξεκαθάρισαν κάποια πράγματα και κυρίως χαίρομαι που αντιμετωπίζεις τη C έτσι θετικά.

Για το άλλο που ρωτάς, άστα να πάνε: Μητρική μου ήταν FORTRAN, που πολύ γρήγορα τη δούλευα παράλληλα με ...PL/I και ...COBOL. Κάποια στιγμή έμπλεξα με την ALGOL (γι αυτό, όταν έγινε της μόδας η Pascal ήμουν το εύκολο θύμα).

Η άποψή μου; Τίποτα δεν πάει χαμένο. Κάθε ώρα που ξοδεύει κανείς στην Pascal, την κερδίζει στο πολλαπλάσιο, όταν μαθαίνει C/C++ ή ακόμη κι όταν γράφει μια μακροεντολή σε VB για να υποτάξει ένα λογιστικό φύλλο.

 

ΥΓ: Μην αντιμετωπίζεις ποτέ τους πίνακες χαρακτήρων (της C) με την λογική των strings της Pascal. Αν είχες δουλέψει την Ver.7 της Borland, προσπάθησε να θυμηθείς, πώς δούλευαν οι μεταβλητές τύπου Pchar.

Δημοσ.

Eisai polla xronia ston programmatismo e? Egw piga na kanw kati to 1998 me tin Basic alla varethika. Meta epiasa tin Pascall to 2002 gia na ilopoiisw enan (kouto profanws) algorithmo kwdikopoiisis, kai "efaga xwma" mexri na vgalw akri apo to help tis Pascal. Otan mou kaike to PC (Athlon 1600), to mono (endiaferon) pou mporousa na treksw itan i Borland C++ 2.0 (1993).

 

Eixa thn Ver.7 tis Borland alla den exw idea ti einai oi meavlites typou Pchar :-| Paro'ola afta den exw provlima me tous arrays stin C. Afto mallon simvainei dioti den eixa xrisimopoiisei arketa tous arrays stin Pascal.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...