Άσκηση C: γιατί δεν τυπώνεται το μήνυμα;

...ασύγχρονα μαθήματα γλώσσας C

Άσκηση C: γιατί δεν τυπώνεται το μήνυμα;

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 19:09

Αντιγράφω από το http://simos.info/blog/archives/421

Τι κάνει το παρακάτω πρόγραμμα και γιατί; (δοκιμάστηκε σε Ubuntu 64-bit, πρέπει να λειτουργεί και σε 32-bit).
Το αποτέλεσμα βοηθάει να καταλάβουμε το πόσο σημαντικό είναι να χρησιμοποιούμε σωστά τους ενταμιευτές (buffers) στη C.

Κώδικας: Επιλογή όλων
#include <stdio.h>

int calculate(void)
{
int i;
int p[9];

for ( i = 0; i <= 3; i++ )
if (sizeof(int*)==8)
p[i*6+2]+=15;
else
p[i*3 + 2] += 16;
}

int main()
{
calculate();
printf("Hello, World!\n");

return 0;
}


Διορθωμένο, δουλεύει σε 32-bit και 64-bit Ubuntu.
Τελευταία επεξεργασία από simosx και 25 Μαρ 2011, 03:30, έχει επεξεργασθεί 2 φορά/ες συνολικά
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό linuxs » 24 Μαρ 2011, 19:45

Πως ακριβώς το κάνεις? ...δεν το κατάλαβα... Βασικά, τι ακριβώς προσπαθείς να πετύχεις με το πρόγραμμα; Να χρησιμοποιήσεις ένα buffer; Σόρρυ, για τις απλές αρωτήσεις μου αλλα δεν μπόρεσα να καταλάβω! ;)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό linuxs » 24 Μαρ 2011, 19:50

simosx έγραψε:Αντιγράφω από το http://simos.info/blog/archives/421

Κώδικας: Επιλογή όλων
#include <stdio.h>
int calculate(void);
int calculate(void) {
int i;
int p[9];
for ( i = 0; i <= 3; i++ )
if (!(sizeof(int)%4))p[i*6+2]+=15;
else p[i*3+2]+=16;
}

int main(int argc, char** argv){
calculate();
printf("Hello, World!\n")
return 0;
}


Κάποιες παρατηρήσεις...

  1. Τα ορίσματα στην main δεν χρειάζονται! Δεν ξέρω αν είχες σκοπό να τα χρησιμοποιήσεις αλλα δεν τα χρησιμοποιείς ;)
  2. Την συνάρτησή σου πάνω απο την main γιατί την ορίζεις; Δεν χρειάζεται...συναρτήσεις ορίζουμε όταν βρίσκονται κάτω απο την main! ;)

Φιλικά, Βασίλης...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 20:03

Κώδικας: Επιλογή όλων

int main(int argc, char** argv){
calculate();
printf("Hello, World!\n")
return 0;
}


Το ζήτημα είναι ότι ο παραπάνω κώδικας κάνει δύο βασικά πράγματα,
1. εκτελεί τη συνάρτηση calculate()
2. εκτυπώνει ένα μήνυμα στην οθόνη.

Όταν το τρέξατε, έκανε τα παραπάνω; Αυτό είναι το ενδιαφέρον του μαθήματος.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό linuxs » 24 Μαρ 2011, 20:39

Κώδικας: Επιλογή όλων

cs091770@csroot:~/Desktop$ ./a.out
Hello, World!


Ακόμη δεν μπορώ να καταλάβω...δεν τρέχει σωστά δηλαδή; Σε εσένα τρέχει αλλιώς;
έγραψε:Οι παρατηρήσεις μου στο προηγούμενο πόστ ισχύουν ακόμη έτσι...δεν έχει σχέση οτι δεν μου βγάζει μήνυμα λάθους!
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 20:56

linuxs έγραψε:
Κώδικας: Επιλογή όλων

cs091770@csroot:~/Desktop$ ./a.out
Hello, World!


Ακόμη δεν μπορώ να καταλάβω...δεν τρέχει σωστά δηλαδή; Σε εσένα τρέχει αλλιώς;
έγραψε:Οι παρατηρήσεις μου στο προηγούμενο πόστ ισχύουν ακόμη έτσι...δεν έχει σχέση οτι δεν μου βγάζει μήνυμα λάθους!


Το ζήτημα είναι ότι σε 64-bit Ubuntu δεν εμφανίζεται το μήνυμα «Hello, World». Στην υπογραφή σου δεν αναφέρεις τι Ubuntu τρέχεις.
(τούτο είναι ερώτημα-μάθημα για δείκτες σε C).
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό linuxs » 24 Μαρ 2011, 21:08

simosx έγραψε:
linuxs έγραψε:
Κώδικας: Επιλογή όλων

cs091770@csroot:~/Desktop$ ./a.out
Hello, World!


Ακόμη δεν μπορώ να καταλάβω...δεν τρέχει σωστά δηλαδή; Σε εσένα τρέχει αλλιώς;
έγραψε:Οι παρατηρήσεις μου στο προηγούμενο πόστ ισχύουν ακόμη έτσι...δεν έχει σχέση οτι δεν μου βγάζει μήνυμα λάθους!


Το ζήτημα είναι ότι σε 64-bit Ubuntu δεν εμφανίζεται το μήνυμα «Hello, World». Στην υπογραφή σου δεν αναφέρεις τι Ubuntu τρέχεις.
(τούτο είναι ερώτημα-μάθημα για δείκτες σε C).



Ναι σωστά.. έχω 32! Ίσως να βελτιώσεις τον αλγόριθμό σου για να τρέχει και σε 32 γιατί είναι πολλοί χρήστε που θα τους εμφανίζεται μόνο hello world! Εννοείς αν θα υπάρχει μάθημα για δείκτες σε C) ;
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 21:16

linuxs έγραψε:
Ναι σωστά.. έχω 32! Ίσως να βελτιώσεις τον αλγόριθμό σου για να τρέχει και σε 32 γιατί είναι πολλοί χρήστε που θα τους εμφανίζεται μόνο hello world! Εννοείς αν θα υπάρχει μάθημα για δείκτες σε C) ;


Είναι καλό να το βάλεις και τώρα στην υπογραφή σου, μιας και κάνεις C.
Μπορείς να φτιάξεις το πρόγραμμα ώστε να παρουσιάζει το σφάλμα και σε 32-bit;
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό linuxs » 24 Μαρ 2011, 21:24

simosx έγραψε:
linuxs έγραψε:
Ναι σωστά.. έχω 32! Ίσως να βελτιώσεις τον αλγόριθμό σου για να τρέχει και σε 32 γιατί είναι πολλοί χρήστε που θα τους εμφανίζεται μόνο hello world! Εννοείς αν θα υπάρχει μάθημα για δείκτες σε C) ;


Είναι καλό να το βάλεις και τώρα στην υπογραφή σου, μιας και κάνεις C.
Μπορείς να φτιάξεις το πρόγραμμα ώστε να παρουσιάζει το σφάλμα και σε 32-bit;


Θα το προσθέσω αν και όλα τα προγράμματα οδηγοί κτλ είναι γραμμένα για windows-ubuntu 32-64 βιτ...
Θα κοιτάξω τον κώδικα ξανά και θα σου πω...μήπως θα μπορούσες να αναλύσεις λίγο το for; τι ακριβώς γίνεται μέσα στο for;

ευχαριστώ...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Γράψιμο στη μνήμη προγράμματος C που εκτελείται

Δημοσίευσηαπό simosx » 24 Μαρ 2011, 22:32

linuxs έγραψε:
Θα κοιτάξω τον κώδικα ξανά και θα σου πω...μήπως θα μπορούσες να αναλύσεις λίγο το for; τι ακριβώς γίνεται μέσα στο for;


Διόρθωσα το αρχικό πρόγραμμα ώστε να είναι πιο κατανοητό, και τώρα δουλεύει και για 32-bit Ubuntu.
Οπότε δοκίμασε!

Η δημοσίευση τούτη είναι άσκηση, οπότε πρέπει να διαπιστώσεις τι κάνει το πρόγραμμα δίχως βοήθεια από εμένα.

προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Επόμενο

Επιστροφή στο Μαθήματα C