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

C Προβλημα με δυναμικη διχειριση μνημης.


antonis1245

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

Δημοσ. (επεξεργασμένο)

Θα είχες δίκαιο αν όντως δε δόθηκε η απάντηση στο πρόβλημα. Τώρα μόνο εκτείθεσαι.

 

Και άντε και εκτέθηκα, σε ποιούς; τα ανώνυμα ποζέρια του ινσόμνια;

Ρητορική η ερώτηση, δε χρειάζεται να απαντήσεις.

 

απλά για γέλια, το 1ο σου σκέλος:

 

Ποοο! Τι inseption τρελο ειναι αυτο...! Αντε βγαλε ακρη.. Τεσπα ευχαριστω πολυ για τη βοηθεια! :-D

 

 

Βέβαια forum είναι, "θόρυβος" θα υπάρχει και θα συνεχίσει αν κρίνω από το λόγο που απάντησες εδώ. Θα μπορούσες να του στείλεις pm.

 

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

 

Επεξ/σία από Lomar
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 142
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

 

 

Η λύση δόθηκε. Το αν κάθησε να το σκεφτεί ο OP ή όχι είναι δικό του θέμα. Θα μπορούσε να ζητήσει περισσότερες εξηγήσεις. Εδώ είμαστε. Ούτε ειρωνεύτηκε κάποιος τον OP, ούτε τίποτα. Επιπρόσθετα, παρακάτω προτάθηκαν ολόκληρες λύσεις οι οποίες είναι ορθές. Αν οποιοσδήποτε νέος κάτσει και τις διαβάσει (του imitheos) θα μάθει πολλά πράγματα. Έχω μάθει προσωπικά, εδώ μέσα πράγματα. Από πολλά διαφορετικά μέλη που έχουν γράψει και σε αυτό το νήμα κι εκτιμώ. Αλλά "στρώθηκα" για να καταλάβω τι λένε. Τροφή για σκέψη...

 

Ποιο είναι το δικό σου κόλλημά δε μπορώ να καταλάβω. Ούτε ποζέρια υπάρχουν ούτε τίποτα από αυτά που λες. Επίσης δε μπορώ να καταλάβω που κολλάς εσύ εδώ ενώ δεν έχεις κάτι παραπάνω χρήσιμο να πεις; Αν έχει σχέση με το νήμα καλώς, διαφορετικά συνέχισέ το σε pm.

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

λολ, μόνο στο ινσόμνια καταλήγει ένα θέμα για κώδικα στο ποιος είναι ο πιο παλιός, ο πιο ANSI C compatible και ο op μένει με το bug στο χέρι.

 

Καλά όχι ότι δε θα γίνει αυτό ακριβώς somewhere on the internet αλλά...

 

1. Του OP του βρήκαμε τα bug, του εξηγήσαμε και προτείναμε και λύσεις. Φαίνεται να κατάλαβε, πάντως δεν εξέφρασε άλλη απορία.

 

2. Το θέμα δεν είναι αν είναι κανείς ANSI ISO C compatible, το θέμα είναι ότι η C είναι από τις ελάχιστες γλώσσες στις οποίες συμβαίνει άνετα το να έχεις ένα πρόγραμμα γεμάτο μαλακίες το οποίο όμως βγάζει με λιγότερη ή περισσότερη τύχη το αναμενόμενο αποτέλεσμα στις συνθήκες υπό τις οποίες δοκιμάζεται. Οπότε όταν έρχεται κάποιος που έμαθε for if printf char** και νομίζει ότι ξέρει C και σου λέει "σαταφάκα ρε αφού δουλεύει το πρόγραμμα", δεν έχεις και πολλές διαφορετικές επιλογές από το να πεις "UB LOL". Σε οποιαδήποτε sane γλώσσα το πρόγραμμα δε θα δούλευε και αυτός που δεν ξέρει δε θα είχε τη δυνατότητα να εξηγεί σ' αυτούς που ξέρουν πόσο κάνει 1+1.

 

PS αυτό είναι τώρα στο Hacker News

 
How to C in 2016

The first rule of C is don't write C if you can avoid it.

 

 

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

@gon1332.

Του imitheos η λύση είναι "σχολικού τύπου". Μπορεί να είναι το πρώτο C πρόγραμμα που έγραψα...αλλά μου πήρε ελάχιστη ώρα να φτιάξω το κώδικα, και αυτό που έκανα ακόμα θα το βλέπεις και θα το σκέφτεσαι και θα λέει ο Defecer ότι δεν είναι βάσει του πρότυπου και άλλα  κολοκύθια. Αυτά του τα λένε εκεί που δουλεύει...αλλά εδώ δεν έχουμε κάτι τέτοιο. Εμένα μου αρέσει ο έξυπνος προγραμματισμός. Ο imitheos εκνευρίστηκε από απανωτές αναθεωρήσεις. Αυτές έγιναν γιατί ήθελα να τεκμηριώσω ότι θα δουλεύει για μεγάλη εκχώρηση μνήμης. Έφτιαξα και άλλο που το δοκίμασα και έτσι είδα ότι δεν δίνει άμεσα άλλο άλλα δείκτη η realloc. Μια πληροφορία που ίσως την ξέρεις. Αλλά έχω να διαβάσω C από το 1987...και πέφτει κάπως πολύς ο καιρός.

Επιπλέον στο κώδικά μου έχω βάλει να εισάγει κανείς φράσεις...αφού ένα λεξικό πρέπει να έχει και το "put on" για παράδειγμα!

Δεν περιμένω να κερδίσω το σεβασμό από το Defecer. Να γίνει περισσότερο άνθρωπος και μετά κάτι θα καταφέρει! Πρώτα δηλαδή μαθαίνουμε να είμαστε ευγενείς. Και όταν κάτι δεν μας αρέσει, ρωτάμε, δεν βγάζουμε με το μυαλό μας ότι "μιλάει κατηγορηματικά". Αν μίλαγα κατηγορηματικά ή αν έκανα τον κάποιο..προφανώς δεν θα ξόδευα λεπτό για το φόρουμ. Επειδή και τα μέλη εδώ δίνουν κάτι από τη ζωή τους...ας πάμε στον δρόμο της ευγένειας και της κατανόησης και μην νομίζουμε ότι έχουμε παιδιά ή τίποτα χαζούς. Αυτό που παίζει βέβαια είναι το "απροσάρμοστος". Σε αυτό όλοι λίγο πολύ πρέπει να βοηθηθούμε να "προσαρμοστούμε".

 

Στο φινάλε ο προγραμματισμός πρέπει να διασκεδάζει!


@Defecer

Ευχαριστώ για το Link παραπάνω...(καλό βοήθημα).

Επεξ/σία από M2000
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Πάντως, αυτό που είπες ότι κι ας έχει UB δουλεύει, ισχύει μόνο στην περίπτωσή σου. Με άλλο compiler και σύστημα τα πράγματα μπορεί να είναι διαφορετικά. Ξαναλέω δεν είδα τον κώδικά σου για να ξέρω τι έκανες (για το λόγο που ανέφερα κι εδώ). Γενικά μιλάω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξέρω τι είναι το UB....o Defacer το είπε. Εγώ έφτιαξα ένα stream αλφαριθμητικών σε ένα μπλοκ μνήμης και χρησιμοποίησα έναν δεύτερο δείκτη για να κινώ τον δρομέα που γράφω στο stream. Στo realloc αν αλλαχτεί η "βάση" πρέπει να αλλάξω και τον δρομέα παίρνοντας την διαφορά (Το offset)..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξέρω τι είναι το UB....o Defacer το είπε. Εγώ έφτιαξα ένα stream αλφαριθμητικών σε ένα μπλοκ μνήμης και χρησιμοποίησα έναν δεύτερο δείκτη για να κινώ τον δρομέα που γράφω στο stream. Στo realloc αν αλλαχτεί η "βάση" πρέπει να αλλάξω και τον δρομέα παίρνοντας την διαφορά (Το offset)..

 

UB ειναι οταν δεν μπορεις να προβλέψεις την συμπεριφορά του προγραμματος πχ το παρακάτω ειναι UB :

 
int main(void)
{
 
  int arr[3]={0};
  int i = 0;
 
  for( ; i <=3; i++)
  arr[i] = i;
 
  return 0;
}
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

το δοκίμασα έτσι:

include <stdio.h>
int main(void)
{
 
  int arr[3]={0};
  int i = 0;
 
  for( ; i <=3; i++)
  arr[i] = i;
  printf("%d - %d \n",arr[3], i);
 
  return 0;
}

έδωσε 3 και 4

Αρχικά το δοκίμασα με arr[2]

λογικά ο πίνακας θα έπρεπε να είχε από 0 έως 2 στοιχεία ή από 0 έως 3 στοιχεία ??

Εδώ όπως παίρνω την απάντηση 3  4 έχει ξεκάθαρα από 0 έως 3 άρα τέσσερα στοιχεία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

UB (Undefined Behaviour) σημαίνει ότι δε μπορείς να είσαι σίγουρος τι αποτέλεσμα ακριβώς θα έχει αυτό που κάνεις. Μπορεί να δουλέψει σωστά, μπορεί και όχι. Το ότι δούλεψε σωστά δε σημαίνει ότι το πρόγραμμά σου είναι σωστό. Από τη στιγμή που έχεις UB μέσα το πρόγραμμα είναι, by definition, λάθος. Μπορεί την επόμενη φορά να κάνει κάτι άλλο, μπορεί σε κάποιο άλλο σύστημα να κάνει κάτι άλλο, μπορεί με κάποιον άλλον compiler να κάνει κάτι άλλο. Γι' αυτό λέγεται και UB.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δες το και διαφορετικά. Στον παραλληλισμό, αν δεν έχεις ορίσει ακριβώς ποιά είναι τα race conditions και αφήσεις το πρόγραμμα να τρέξει κάποιες φορές θα τρέξει σωστά, αλλά άλλες λάθος. Μπορεί να είσαι τόσο τυχερός που δε σκάει ποτέ. Το πουλάς όμως αυτό το πρόγραμμα; Κάπως έτσι κι εδώ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

το δοκίμασα έτσι:

include <stdio.h>
int main(void)
{
 
  int arr[3]={0};
  int i = 0;
 
  for( ; i <=3; i++)
  arr[i] = i;
  printf("%d - %d \n",arr[3], i);
 
  return 0;
}

έδωσε 3 και 4

Αρχικά το δοκίμασα με arr[2]

λογικά ο πίνακας θα έπρεπε να είχε από 0 έως 2 στοιχεία ή από 0 έως 3 στοιχεία ??

Εδώ όπως παίρνω την απάντηση 3  4 έχει ξεκάθαρα από 0 έως 3 άρα τέσσερα στοιχεία.

 

Ναι αλλα δεν έχεις δεσμευσει 4 στοιχεια στη δηλωση σου. 3 δεσμεύεις [0] , [1] και [2]. Δεν ειναι σωστο αρχικά να δεσμευεις 3 στοιχεια και μετα να εκχωρεις τιμή εκτος οριων του πινακα σου.

 

 

 
#include<stdio.h>
 
int main(void)
{
 
    int i , a[3]={0};
   
    for(i=0; i<4; a[i++] = 2)
         printf("%d" , i);
 
    for(i=0; i<3; i++)
         printf("%d" , a[i]);
 
    return 0;
}
 

 

Σε αυτο το "αθώο" loop το i μπορεί να αποθηκευτεί στην αμέσως μετα θέση στην μνήμη οποτε το a[3] θα το θέσει σε 2 ξαναμπαίνοντας στο loop και προκαλώντας Udenfined behaviour. Δεν μπορείς να εγγυηθείς την σειρά των μεταβλητων στην στοίβα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι καταλαβαίνω γιατί το έψαξα και δεν σου πετάει λάθος επειδή δεν κάνει έλεγχο ορίων, για οικονομία! Αλλά το malloc δεν δίνει λιγότερο από 16bytes...(μπορεί να το κάνει ο gcc αυτό).

Στο δικό μου πρόγραμμα δεν έχω επεκταθεί εκτός ορίων, άρα δεν έχω UB. Εκεί που μπορεί κανείς να πει ότι μπορεί να παίξει είναι το μέγεθος του char αλλά έχω την εντύπωση ότι δεν έγινε by default 2bytes.

 

Σε VB6 με option base 0 έχουμε 4 στοιχεία και όχι 3 με DIM a(3)

Dim a(3) As Integer
Sub B()
Debug.Print a(3), a(0)
End Sub

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά ρε παιδιά και σας τα ίδια πράγματα σας λένε στη δουλειά;

 

 

 

θα λέει ο Defecer ότι δεν είναι βάσει του πρότυπου και άλλα  κολοκύθια. Αυτά του τα λένε εκεί που δουλεύει...αλλά εδώ δεν έχουμε κάτι τέτοιο.

 

Στο δικό μου πρόγραμμα δεν έχω επεκταθεί εκτός ορίων, άρα δεν έχω καταλάβει τι σημαίνει UB.

 

Fixed.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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