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

Ερωτήσεις για C


capoelo

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

Ευχαριστω πολυ για την απαντηση σου!!!

Τον δευτερο τροπο δεν τον γνωριζω καλα οποτε θα προσπαθησω το πρωτο που ειπες....

Οταν ομως δηλωνω την συναρτηση θα την δηλωσω ως τι??? 

Επιτρεπεται δηλαδη κατι τετοιο??

mistake search(game)
{
   ...
}

 

οπου mistake ειναι το struct me τις συντεταγμενες????

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

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

όταν κάνω fork() πως μπορώ να μοιράζω έναν int και ένα char * (c-string) στο παιδί και στον γονέα??

 

Αν θες απλά να έχει απο ένα αντίγραφο ο κάθε ένας τότε αρκεί να είναι ορισμένα πριν την fork και θα αντιγραφούν και στους δύο νομίζω.

 

 

Αν θες τώρα πραγματικό memory sharing τότε πρέπει να ξεκαθαρίσουμε για τι σύστημα μιλάμε. Υπάρχουν διάφοροι τρόποι και τεχνικές.

 

Για POSIX δες εδώ για παράδειγμα.

 

Και εδώ.

 

Παραθέτω την πρώτη απάντηση απο το stack.

 

 

The primary way to share data between processes using UNIX IPCs are:
 
(1) Shared memory;
 
(2) Sockets:
 
There are other UNIX IPCs including
 
(3) Message Queues.
 
(4) Semaphores;
 
(5) Signals.

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

κάτι τέτοιο θέλω:

 

 

 

 

#include <unistd.h>
#include <sys/types.h>  
#include <errno.h>   
#include <stdio.h>

int
main(int argc, char *argv[])
{
 
    int i = 0;
    pid_t    pid;
    char *word = "INSOMNIA";
    
    if ((pid = fork()) < 0)
        perror("fork error");
    else if (pid > 0) {
        printf("P: %c\n", word[i]);
    i++;
    printf("P: %c\n", word[i]);
    i++;
        

    } else {
        printf("C: %c\n", word[i]);
    i++;
    printf("C: %c\n", word[i]);
    i++;
    }
    
    return 0;
}

 

 

 

 

αλλα να μοιράζεται γιατί μετά θέλω semaphores να χρησιμοποιήσω...

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

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

Ευχαριστω πολυ για την απαντηση σου!!!

Τον δευτερο τροπο δεν τον γνωριζω καλα οποτε θα προσπαθησω το πρωτο που ειπες....

Οταν ομως δηλωνω την συναρτηση θα την δηλωσω ως τι??? 

Επιτρεπεται δηλαδη κατι τετοιο??

mistake search(game)
{
   ...
}
 

οπου mistake ειναι το struct me τις συντεταγμενες????

 

 

 

 

 

Ναι, αλλά (άσχετα με το struct) πρέπει να δηλώσεις και τον τύπο του game μέσα στις παρενθέσεις...

 

MyStruct search( GameType game )
{
    ...
}
Επεξ/σία από migf1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν συγκρίνουμε 2 δεικτες που δειχνουν σε διαφορετικούς πινακες το αποτελεσμα ειναι undefined ή απλα 0?

 

 

 
char str1[]="abc" , str2[]="def";
 
if ( str1 == str2 )
 
.....
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Όταν συγκρίνουμε 2 δεικτες που δειχνουν σε διαφορετικούς πινακες το αποτελεσμα ειναι undefined ή απλα 0?

 

 

 
char str1[]="abc" , str2[]="def";
 
if ( str1 == str2 )
 
.....
 

Η ισότητα αυτή δεν γίνεται να είναι ποτέ αληθής γιατί οι str1 και str2 έχουν την τιμή της διεύθυνσης της μνήμης που είναι αποθηκευμένοι οι δύο πίνακες.

Ακόμα κι αν είχες ορίσει:

str1[]="abc", str2[]="abc";

Οι str1 και str2 έχουν διαφορετική τιμή.

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

Η ισότητα αυτή δεν γίνεται να είναι ποτέ αληθής γιατί οι str1 και str2 έχουν την τιμή της διεύθυνσης της μνήμης που είναι αποθηκευμένοι οι δύο πίνακες.

Ακόμα κι αν είχες ορίσει:

str1[]="abc", str2[]="abc";

Οι str1 και str2 έχουν διαφορετική τιμή.

 

Nαι βρε το ξερω οτι θα δωσει FALSE και ευχαριστω και για την απαντηση απλα αναρωτιεμαι αν ειναι UB κατι τέτοιο επειδη στην αφαιρεση ενος δεικτη απο εναν αλλον αν δεν δειχνουν στον ιδιο πινακα έχουμε Undefined behaviour

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

Nαι βρε το ξερω οτι θα δωσει FALSE και ευχαριστω και για την απαντηση απλα αναρωτιεμαι αν ειναι UB κατι τέτοιο επειδη στην αφαιρεση ενος δεικτη απο εναν αλλον αν δεν δειχνουν στον ιδιο πινακα έχουμε Undefined behaviour

Δεδομενου πως οι δείκτες είναι απρόσημες ακέραιες τιμές (μνήμης), γιατί να έχουμε UB? Το που δείχνουν δεν έχει σχέση με την αφαίρεση των διευθύνσεων αυτών που δείχνουν.

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

Nαι βρε το ξερω οτι θα δωσει FALSE και ευχαριστω και για την απαντηση απλα αναρωτιεμαι αν ειναι UB κατι τέτοιο επειδη στην αφαιρεση ενος δεικτη απο εναν αλλον αν δεν δειχνουν στον ιδιο πινακα έχουμε Undefined behaviour

Δεν μπορώ να σου απαντήσω με σιγουριά, αλλά η λογική μου λέει ότι είναι False κι όχι UB.

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

Επαναλαμβάνω δεν το γνωρίζω, εικασίες κάνω... :P

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

 

whatever *p = στον γάμο του καραγκιόζη;
whatever *q = στου έξω από 'δω την μάνα;

printf( "%ld\n, (long int)(p-q) );  // no problem

Η πράξη αυτή καθ'αυτή δεν είναι πρόβλημα και συμφωνώ, αυτό που λέω είναι για το τι γίνεται όταν πάς να κάνεις access τον (p-q). ( Δηλαδή το *(p-q) )

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

Η πράξη αυτή καθ'αυτή δεν είναι πρόβλημα και συμφωνώ, αυτό που λέω είναι για το τι γίνεται όταν πάς να κάνεις access τον (p-q).

Ναι, κατάλαβα τι εννοείς και προφανώς ισχύει.

 

Απλώς η αρχική ερωτηση αφορούσε την σύγκριση μεταξύ 2 δεικτών, για το αν οδηγεί δηλαδή σε UB... δεν οδηγεί σε UB, διότι δεν διαφέρει σε τίποτα από την σύγκριση οποιωνδήποτε, ομοειδών ακέραιων τιμών.

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

Ευχαριστω guys ;)

 

Μαλλον μπερδεύτηκα με αυτο ->

 

Although addresses are represented by numbers , their range of values may differ from that of integers , so we can't necessarily store them in ordinary integer variables . We can however store them in special pointer variables.

 

Οποτε οι δεικτες ειναι μεν ακεραιες απροσημες τιμές αλλα το περιεχομενο αυτου που θα δειχνουν μπορει να διαφερει Πχ να δειχνουν σε τοποθεσια μνημης η οποια έχει περιεχομενο εναν προσημασμένο ακέραιο ,  αυτο θελει να καταλαβει ο αναγνωστης εδω?

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

Αυτό που θέλει να πει ο ποιητής είναι οτι η διεύθυνση μνήμης αναπαρίσταται από έναν αριθμό αλλά αυτός ο αριθμός μπορεί να είναι μεγαλύτερος από το έυρος τιμών των integers. Αν δηλαδή σε μια int μεταβλητή μπορείς να αποθηκευσεις αριθμούς στο διάστημα (-10,10] δε μπορείς να αποθηκευσεις μια διευθυνση μνημης γιατί αυτη μπορεί να αναπαρισταται από τον αριθμό 100 πχ. Για αυτο το λόγο χρησιμοποιούμε ένα άλλο είδος μεταβλητής (τους δεικτες που είναι long int όπως ανέφερε ο migf1) που μπορούν να αποθηκευουν και μεγαλυτερους αριθμους. Κάτι τέτοια στο περίπου :P

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

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

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