IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Récupérer a la sortie d'une fonction une matrice de taille inconnue


Sujet :

C

  1. #1
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut Récupérer a la sortie d'une fonction une matrice de taille inconnue
    Bonjour.

    Je dois actuellement recoder une appli python en C pour un gain de temps de calcul, mais étant débutant (mauvais serait le terme plus exact) dans ce langage, j'ai besoin de vos lumieres.


    Je cherche a recuperer dans ma fonction principale une matrice écrite par une fonction, mais la taille de cette matrice sera imposé par la fonction et je n'ai donc aucun moyen de connaitre sa taille dans le main.

    J'ai essayé la methode que je trouvais instinctive, c'est a dire lire dans le main le pointeur (pointant la matrice) renvoyé par la fonction, mais la ou seule 4 caracteres doivent s'affiché, j'en ai un vingtaine.

    Quelqu'un a une idée de principe pour se probleme.

    Question subsiliaire : comment passer une matrice a 3 dimensions a une fonction.

    Merci de votre aide.

    Lau

  2. #2
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Citation Envoyé par lapinoufly Voir le message
    Je cherche a recuperer dans ma fonction principale une matrice écrite par une fonction, mais la taille de cette matrice sera imposé par la fonction et je n'ai donc aucun moyen de connaitre sa taille dans le main.
    Tu es sur le bon chemin.
    Dans ton main tu déclare un pointeur, tu le passe à ta fonction qui vas malloc le pointeur et remplir la matrice.
    Une fois de retour dans le main, n'oublie pas de free ^^

    Citation Envoyé par lapinoufly Voir le message
    J'ai essayé la methode que je trouvais instinctive, c'est a dire lire dans le main le pointeur (pointant la matrice) renvoyé par la fonction, mais la ou seule 4 caracteres doivent s'affiché, j'en ai un vingtaine.
    Donne nous un code à debug


    Citation Envoyé par lapinoufly Voir le message
    Question subsiliaire : comment passer une matrice a 3 dimensions a une fonction.
    en passant un pointeur de pointeur de pointeur?
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 697
    Points : 30 996
    Points
    30 996
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lapinoufly Voir le message
    Je dois actuellement recoder une appli python en C
    Quel dommage !!! Moi qui connait les deux langages, après avoir goûté à Python je pleurerais si je devais revenir au C...

    Citation Envoyé par lapinoufly Voir le message
    pour un gain de temps de calcul
    J'ai eu une fois un pb de temps de calcul en Python et j'avais aussi envisagé, beaucoup de dégoût, de passer par le C. Puis j'ai réfléchi. Comme j'utilisais aussi une bdd Postgres, j'ai alors choisi de déporter mes calculs dans des tables temporaires Postgres en laissant à ce moteur le soin d'effectuer tous les calculs et les liens entre les infos à la place de Python. Et ça a marché. Comme quoi, comme le dit sloshy, il n'y a jamais une seule solution à un problème...

    Citation Envoyé par lapinoufly Voir le message
    Question subsiliaire : comment passer une matrice a 3 dimensions a une fonction.
    Si tu dois passer un tableau d'int à une fonction, style int tab[x], tu passes tab et ta fonction stocke ce "tab" dans un "int *pt" ou un "int pt[] ou un "int pt[x]"

    Si tu dois passer un tableau 2D d'int à une fonction, style int tab[y][x], tu passes toujours tab mais ta fonction le stockera dans un "int *pt[x]" ou un "int pt[y][x]". En aucun cas elle ne pourra le stocker dans un "int **pt" parce qu'elle a besoin de la dimension [x] pour pouvoir se caler. En effet, la case [m][n] se calcule comme "m * x + n" (n'oublie pas qu'un tableau, même 2D, n'est en réalité qu'une grosse suite de cases et que la 2D n'est que simulée).

    Ainsi, si tu dois passer un tableau 3D d'int à une fonction, style int tab[z][y][x], tu passes toujours tab mais ta fonction le stockera dans un "int *pt[y][x]" ou un "int pt[z][y][x]". Pour la même raison que précédemment, elle ne pourra pas le stocker dans un "int ***pt"

    En fait, l'équivalence pt[] <=> *pt n'est valable que pour la première dimension d'un tableau...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    merci pour l'info, je me coucherai moins bête ce soir
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  5. #5
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    Merci de votre aide, mais la réponse m'amène a un autre problème....

    Pour vous mettre un peu dans le bain, je fais actuellement du traitement d'image pour des automatismes.

    Mon main envoie une image déformée a une fonction qui a pour but de la "redresser". Pour faire simple je connais la taille de l'image que j'envoie, mais je ne connais pas la taille de l'image que je récupère (deformation...).


    Les 2 methodes instinctives que j'avais, c'etais de renvoyer directement l'image redressé en sortie de la fonction avec un return, un truc du genre :

    *image_redresse = fonction_redressage (image_deforme)

    Mais le compilateur ne connaissant pas les dimensions de image_redresse, ca part en vrille et le resultat n'est pas ce que je veux.

    La seconde methode était de donner en argument de la fonction le pointeur de debut de matrice:

    fonction_redressage (image_deforme , *debut_pointeur)

    mais ne connaissant pas la taille de ma matrice, je ne peut faire une allocation memoire propre.....

    Voila ou commence mes problemes....
    Si vous avez des solutions a proposer...


    Et oui je suis degouté de repasser en C...
    J'utilise python pour valider mes algorithmes de traitements d'image, et je m'en sortais jusque la, mais la c'est trop lourd... j'ai besoin de 25 images/ secondes et pour l'instant j'en ai que 12... passage en C obligé!

  6. #6
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    1-pour le probleme de base une idée me viens....

    si ma fonction retourne un vecteur donnant : ref_image=[nb_ligne , nb_colonne, debut_pointeur], ce qui donnerais vu du main

    *ref_image= fonction_redressage (image_deforme)

    il doit etre possible de reformer image redressé en 2/3 lignes, non?

    2-Existerait il une classe "matrice" deja toute faite qui me permettrais de passer simplement une matrice

    3- pour un autre probleme je suis en train de seuiller un vecteur A, et je veux recuperer la position des valeurs superieurs au seuil dans un autre vecteur B.
    Probleme je ne connais pas la dimension du vecteur B donc je ne peux pas le declarer proprement.

    Si j'alloc pas assez de memoire j'efface des données et si j'alloc trop de memoire ben je consomme trop de memoire....
    Quel solution est couramment utilisés?
    Realoc a chaque fois que je veux ajouter une valeur?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 697
    Points : 30 996
    Points
    30 996
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lapinoufly Voir le message
    1-pour le probleme de base une idée me viens....

    si ma fonction retourne un vecteur donnant : ref_image=[nb_ligne , nb_colonne, debut_pointeur], ce qui donnerais vu du main

    *ref_image= fonction_redressage (image_deforme)

    il doit etre possible de reformer image redressé en 2/3 lignes, non?

    2-Existerait il une classe "matrice" deja toute faite qui me permettrais de passer simplement une matrice
    Désolé. Le C est très primaire. Il ne peut manipuler que des types simples (int, char, short, etc) et des adresses. Il ne sait même pas manipuler une simple chaine alors une matrice...
    A toi de faire avec ce que le C te donne. Ton seul atout: une zone allouée est toujours contigüe en mémoire. Et donc avec
    - l'adresse de début
    - le nb d'éléments
    Tu peux alors tout récupérer. La suite, c'est de la gestion, de l'algorithmie et de l'intuition...

    Citation Envoyé par lapinoufly Voir le message
    3- pour un autre probleme je suis en train de seuiller un vecteur A, et je veux recuperer la position des valeurs superieurs au seuil dans un autre vecteur B.
    Probleme je ne connais pas la dimension du vecteur B donc je ne peux pas le declarer proprement.

    Si j'alloc pas assez de memoire j'efface des données et si j'alloc trop de memoire ben je consomme trop de memoire....
    Quel solution est couramment utilisés?
    Realoc a chaque fois que je veux ajouter une valeur?
    Un realloc c'est relativement long. On essaye donc de faire des compromis. Et donc généralement, quand on gère des flux de taille inconnue, on fait des allocations par blocs. On alloue N et on gère une taille allouée et une taille utilisée. Et dès que la taille utilisée atteint la taille allouée, on réalloue N de plus. Ca évite le realloc à chaque tour de boucle (et c'est relativement souple puisqu'on peut, si on désire, positionner quand-même N à 1).
    Et comme toutes ces variables de gestion vont ensemble, ben on les groupe dans une structure ce qui est ensuite plus simple à manipuler.

    Exemple pour stocker des char qui arrivent en flot continu
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    typedef struct {
        char *tab;
        char *new;
        size_t alloc;
        size_t current;
    }t_dynamic;
     
    char carac;
    t_dynamic zone;
    zone.tab=NULL;
    zone.new=NULL;
    zone.alloc=0;
    zone.current=0;
     
    while (carac=donnee_arrive())
    {
        // Si besoin mémoire (au premier appel, un realloc se comporte comme un malloc)
        if (zone.current == zone.alloc)
        {
            zone.alloc+=N;
            zone.new=realloc(zone.tab, zone.alloc * sizeof(char));
            if (zone.new == NULL)
            {
                 // malloc/realloc échoué - Cas à traiter - Il se terminera probablement par une libération de ce qui a déjà été alloué et une interruption de la fonction
                 ...
            }
     
            // malloc/realloc réussi - Le nouveau pointeur remplace l'ancien
            zone.tab=zone.new;
        }
     
        // Stockage caractère lu
        zone.tab[zone.current]=carac;
        zone.current++;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    Que pense tu de la syntaxe :


    int *matrice[nb_ligne][nb_colonne]=debut_pointeur;

    pense tu que ca me permettrais de reconstituer un tableau n*m utilisant les données écrites par la fonction.


    Merci pour le bout de code de la realloc

    Je trouve ce langage vraiment tres limité... on se demande pourquoi c'est devenu un standard...

    Dans tout les cas je te remercie d'avoir pris le temps de me repondre, et de l'avoir fait avec justesse.

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    @Sve@r
    Si tu dois passer un tableau 2D d'int à une fonction, style int tab[y][x], tu passes toujours tab mais ta fonction le stockera dans un "int *pt[x]" ou un "int pt[y][x]".
    Dans un int (*pt)[x] avec les parenthèses, sinon c'est un tableau de pointeur et non pas un pointeur sur tableau.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 697
    Points : 30 996
    Points
    30 996
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lapinoufly Voir le message
    Que pense tu de la syntaxe :


    int *matrice[nb_ligne][nb_colonne]=debut_pointeur;

    pense tu que ca me permettrais de reconstituer un tableau n*m utilisant les données écrites par la fonction.
    Hum... je vois pas trop où tu vas aller avec ça.
    En C faut rester très simple.
    1) tu crées une zone mémoire correspondant à ton schéma (une matrice 3D si c'est ça qu'il te faut => int matrice[x][y][z])
    2) si tu dois passer ta matrice à une fonction, tu lui passes "matrice" et ta fonction stockera ce pointeur dans un int pt[x][y][z]
    3) si une des dimensions de ta matrice est inconnue, tu remplaces [] par * et ensuite te faudra allouer/réallouer de la mémoire en fonction des besoins
    Et surtout, toujours faire un schéma. Surtout quand on dépasse la 2D...

    Citation Envoyé par lapinoufly Voir le message
    Je trouve ce langage vraiment tres limité... on se demande pourquoi c'est devenu un standard...
    C'est sur qu'en arrivant de Python... mais faut pas oublier que le C
    1) est hyper rapide => il ne fait aucun contrôle, considérant que "le programmeur sait ce qu'il fait"
    2) date de 1968 et a été créé pour écrire un système d'exploitation et non pour écrire des applis de haut vol
    Et donc ceci explique cela...

    Citation Envoyé par diogene Voir le message
    @Sve@r

    Dans un int (*pt)[x] avec les parenthèses, sinon c'est un tableau de pointeur et non pas un pointeur sur tableau.
    Exact. Je suis rouillé en C. J'en ai plus fait depuis que je me suis mis à Python en 2007...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par lapinoufly Voir le message
    Je trouve ce langage vraiment tres limité... on se demande pourquoi c'est devenu un standard...
    Essaie de coder un Dead Space, un GTA4 ou simplement un Mario en python et tu auras ta réponse...

    Sinon pour ton problème de retour, je te conseille de créer une structure contenant le pointeur vers ta matrice ainsi que ses dimensions. Ta fonction doit donc fabriquer la matrice et remplir la structure. Elle retournera un pointeur vers la structure au lieu d'un pointeur vers la matrice. Il me semble que c'est la façon "standard" de faire.

  12. #12
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par lapinoufly Voir le message
    Je trouve ce langage vraiment tres limité... on se demande pourquoi c'est devenu un standard...
    Pour c'est ca que bien que l'on peut trouver les lapins mignons, on hésite pas à les manger !

    Ce genre de phrase, volontairement provocatrice, donne envie de bouffer du lapin

    Python (lui même codé en C..., trouver l'erreur !) est de loin beaucoup plus limité que le C... Le C n'a pratiquement aucune limite et c'est pour ca que c'est le seul langage réellement portable sur toute les plateformes existantes, du microcontroleur au serveur web.
    Je ne connais aucun OS codé en python. Bizarre..

    Bon il est midi et temps d'aller manger
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  13. #13
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    <troll>
    Puisqu'il y a des OS écrit en java, ça veut dire que c'est un aussi bon langage que le C?
    *sors-
    </troll>
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  14. #14
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par sloshy Voir le message
    <troll>
    Puisqu'il y a des OS écrit en java, ça veut dire que c'est un aussi bon langage que le C?
    *sors-
    </troll>
    Le C n'est pas "meilleur" que d'autres, ce n'était pas mon propos.

    Il n'existe pas de OS 100% java (JavaOS par exemple n'est que à 85% de code java) ni même d'OS 100% C (il y a toujours une partie d'assembleur).
    Par contre un OS uniquement codé en Java et assembleur, je connais pas... Et puis une JVM est forcément codée en C ou C++

    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  15. #15
    Invité
    Invité(e)
    Par défaut
    +1
    Mais je vais aussi ajouter quelque-chose.
    1- on parle de matrice, alors qu'il s'agit de tableau, quelle en est la raison?
    2- on parle de vecteur, c'est quelque-chose qui a un sens très particulier et très bien défini. De quoi s'agit-il ici?
    3- on parle de classe. Les classes n'existent pas en C, pour cela il faut aller voir du côté du C++.
    4- vous parlez aussi de "solutions intuitives", dans ce domaine, on parle plus souvent de logique que d'intuition

    Mais je suis peut-être complètement dépassé.

  16. #16
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    Ca y est j'ai lancé un debat on dirait....

    Voila ma vision du truc si vous voulez....
    Pour moi un langage est efficace s'il est facilement compréhensible de tous ses utilisateurs et qu'il est assez limpide pour ne laisser place a aucune interprétation (qu'on parle de langage informatique ou non).

    Est ce que le langage C correspond bien a ces criteres?....non.
    Ce forum en est le meilleur exemple... que de questions, de doutes concernant ce langage.

    Je sais tres bien que pour les couches bas niveaux mieux vaut passer par C que par de l'assembleur (quoique le C est compilé par la suite en assembleur), mais pour des applications ne necessitant pas une optimisation extreme, il aurait été bon d'adopter comme standard un langage alternatif.
    Moins de prise de tete a debugger, temps de développement réduit, donc applis moins couteuses, accessible par un grand nombre de personne.... imaginer un monde sans C

    Pour repondre un peu ce qu'on me dit sur python, au defi peux tu coder un mario en python je repondrais peux tu coder un systeme de guidage de missile en moins d'un mois... avec python i did it.

    Désolé si j'ai froissé vos âmes de puristes du C messieurs, et merci d'avoir pris le temps de lire mon post. Cependant on m'enlèvera pas de la tete que cette vieille dame quarantenaire qu'on appelle C mériterais qu'on la remplace par une fraiche demoiselle comportant ce qu'il faut la ou il faut.

    Et pour repondre au dernier commentaire:
    je parle de matrice parce que c'est effectivement des matrices mathématiques que je manipule. De plus j'ai l'impression qu'en prog, un tableau represente plus un vecteur (je me trompe peut etre).
    Concernant les solutions intuitives, cela s'oppose aux solutions raisonnés avec du temps : en gros la première idée qui viens.


    (\__/)
    (='.'=) vendra chèrement sa peau
    (")_(")

  17. #17
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    je n'ai jamais dit que python pue et le c est trop top... Loin de la.

    Ce sont deux très bon langages, dont les utilisations diffèrent c'est tout !

    Et je n'ai fais que répondre sur la remarque 'le C est limité', balancé hors contexte...

    Le C n'est pas limité, comme python n'est pas un langage limité...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 697
    Points : 30 996
    Points
    30 996
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lapinoufly Voir le message
    Ca y est j'ai lancé un debat on dirait....

    Voila ma vision du truc si vous voulez....
    Pour moi un langage est efficace s'il est facilement compréhensible de tous ses utilisateurs et qu'il est assez limpide pour ne laisser place a aucune interprétation (qu'on parle de langage informatique ou non).

    Est ce que le langage C correspond bien a ces criteres?....non.
    Ce forum en est le meilleur exemple... que de questions, de doutes concernant ce langage.

    Je sais tres bien que pour les couches bas niveaux mieux vaut passer par C que par de l'assembleur (quoique le C est compilé par la suite en assembleur), mais pour des applications ne necessitant pas une optimisation extreme, il aurait été bon d'adopter comme standard un langage alternatif.
    Moins de prise de tete a debugger, temps de développement réduit, donc applis moins couteuses, accessible par un grand nombre de personne.... imaginer un monde sans C
    Faut pas oublier l'aspect temporel de la chose. Le C a été inventé à une époque où on n'avait pas de mémoire, pas de disque, et où les champs dates des programmes et fichiers COBOL étaient codés sur 2 digits pour gagner de la place (bug de l'an 2000). Le C répondait donc à des critères de l'époque où il fallait un langage compact pour des besoins d'espace et de rapidité. Et celui qui a lu et assimilé les bouquins de K & R n'a aucun doute ou interrogations sur ce langage (ou alors s'il a des interrogations, ce sont des interrogations d'un pro qui cherche le détail qui optimisera un peu plus si possible une boucle où un algo).

    Aujourd'hui tout est inversé. On a du disque, de la mémoire à n'en plus savoir qu'en faire. On a même tant de place qu'on en vient à intégrer pour chaque ligne de data des fichiers la description de ces datas (format XML).
    Alors certes aujourd'hui, Python (ou d'autres langages aussi performants) arrivent avec leurs dictionnaires, leurs objets natifs et leurs souplesse d'utilisation et on peut alors avoir un certain découragement à traduire un code Python en code C mais on peut pas dire que le C est à mettre à la poubelle. Il conserve ses atouts d'origine. Il est rapide, concis. Sa traduction en assembleur est légère. Bref il a lui aussi ses avantages. Je connais des gens qui codent encore des algos en C parce qu'il est rapide, parce que leur algo traite de fichiers binaires (comme sons ou images) donc facile à prendre en charge en C, parce qu'ils n'ont pas besoin des possibilités de Python, etc etc.
    A l'inverse moi j'ai fait beaucoup de C mais aujourd'hui je suis 100% Python. Parce que mes applis intègrent de l'IHM, qu'elles tapent dans de la bdd sur des tables qui ont du champ date, du champ numeric(x,y) (parce que j'ai besoin de calculs en précision exacte) et que je veux pas perdre 4H à écrire le code qui devra gérer la mémoire pour stocker mes infos (je préfère écrire if (nom, prenom) == ("xxx", "yyy") que if (strcmp(nom, "xxx") == 0 && strcmp(prenom, "yyy") == 0)) même si mon code est plus lent que le même code en C...

    Aucun langage de programmation n'est parfait. Il n'existe même pas un langage meilleur que d'autres ; il n'y a que des langages en adéquation ou peu conseillés pour des buts particuliers. (Herbert Mayer).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Nouveau membre du Club

    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et celui qui a lu et assimilé les bouquins de K & R
    Peux tu m'en dire plus?


    Je ne dit pas qu'il faut supprimer C, beaucoup de collègues l'utilisent pour des systèmes embarquées temps reel.
    Ce que je veux dire c'est que fut un temps, l'assembleur fut la norme, puis l'augmentation de la puissance a permis d'utiliser C.
    La puissance actuelle ne permettrais elle pas d'adopter comme standard un langage plus transparent pour l'utilisation de la memoire?

    Le probleme est que pour maitriser correctement ce langage, il faut en gros avoir un diplome d'ingeneur informaticien.

    La prog represente seulement 10% des competences que je dois avoir pour arrivé au bout de mes projets ( fusion de données, calibrage, traitement d'image, comportement probabiliste, modelisation dynamique, commande robuste) et ca me gonfle de perdre autant parce que se langage ne me permet pas facilement de lire une matrice renvoyée par une fonction.
    Et C est tellement imposé partout que je n'ai pas le choix de l'utiliser ou non.



    Pendant que j'y suis, j'ai testé le code suivant trouvé sur un forul, quelque'un saurait me dire pourquoi il bug, et encore mieux le faire marcher:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int main()
    {
     
    int nblignes=2;
    int nbcolonnes=2;
     
     
    int i;
     
    int ** tableau2d = malloc(nblignes*sizeof(int));
    for( i = 0; i < nblignes; i++)
    {
        tableau2d[i] = malloc(nbcolonnes*sizeof(int));
    }
     
     
    tableau2d[1][1]=0;
    printf(tableau2d[1][1]);
    }
    Merci

  20. #20
    Invité
    Invité(e)
    Par défaut
    Si vous n'aimez pas ça, n'en dégoutez pas les autres.

    Que ça vous "gonfle", ce n'est pas dans ce forum qu'il faut le dire.

    Pour votre information une matrice est une représentation mathématique d'une fonction. Par exemple la rotation en plan a pour matrice représentative (1,-1)(1,1)
    Ce dont vous parlez sont des TABLEAUX.
    La FAQ donne toutes les informations nécessaires à ce sujet. Comme c'est la base et facile, je pense qu'un peu de lecture sera amplement suffisant.
    Quant aux vecteurs, vérifiez vos affirmations.

    Encore pour votre information, le constat que le C date de 40ans ne signifie pas qu'il est "ancien" "vieux" ou je ne sais quoi, mais un langage qui tient ses promesses depuis aussi longtemps et partiquement sans modification, chapeau MM. K & R
    Alors, s'il vous plait ne venez pas critiquer ce que vous ne connaissez pas.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. appliquer une fonction à une fonction
    Par stracoma dans le forum C++
    Réponses: 6
    Dernier message: 20/03/2015, 16h35
  2. Réponses: 2
    Dernier message: 14/01/2011, 11h05
  3. Récupérer le nom du fichier qui appelle une fonction
    Par DeezerD dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 14h37
  4. Réponses: 2
    Dernier message: 08/10/2006, 11h44
  5. passer en paramettre d'une fonction une fonction
    Par RoM3Ro dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/06/2006, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo