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

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

Δημοσ.

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

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

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

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

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
Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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