Derniers sujets
Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité Aucun
Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion
Statistiques
Nous avons 241 membres enregistrésL'utilisateur enregistré le plus récent est ben_frog
Nos membres ont posté un total de 8921 messages dans 811 sujets
maxiNoob apprend le C
+6
Admin
Godzil
didierv
Arnoric
Symoon
maximus
10 participants
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 2
Page 1 sur 2 • 1, 2
maxiNoob apprend le C
Bonjour à vous les maîtres du C
Je vais essayer de lâcher le BASIC au profit du C, je dis bien je vais essayer, pas sûr que j'aboutisse
Aussi merci par avance de pardonner mes questions qui pourront vous paraître, ... BASIC
Je suis dans le site openclassrooms (ex siteduzéro) qui propose des cours pour débutants, et si le début est assez simple, je bute sur le cours des chaines de caractères, il faut dire que par rapport au BASIC ou au PASCAL, c'est pas de la tarte
J'essaie d'afficher les lettres en utilisant le code ASCII, ça marche bien avec une lettre unique, comme 65 qui affiche A, mais avec une boucle j'arrive à rien, il affiche tj le même caractère, qqu'un voit il mon erreur ?
Voila le screen de la console (codeblocks)
Je vais essayer de lâcher le BASIC au profit du C, je dis bien je vais essayer, pas sûr que j'aboutisse
Aussi merci par avance de pardonner mes questions qui pourront vous paraître, ... BASIC
Je suis dans le site openclassrooms (ex siteduzéro) qui propose des cours pour débutants, et si le début est assez simple, je bute sur le cours des chaines de caractères, il faut dire que par rapport au BASIC ou au PASCAL, c'est pas de la tarte
J'essaie d'afficher les lettres en utilisant le code ASCII, ça marche bien avec une lettre unique, comme 65 qui affiche A, mais avec une boucle j'arrive à rien, il affiche tj le même caractère, qqu'un voit il mon erreur ?
Voila le screen de la console (codeblocks)
- Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char lettre = 65;
printf("lettre: %c \n",lettre);
printf("code ASCII: %d \n",lettre);
char nom[]="Denis", chaine[6];
printf("%s \n",nom);
char i=0;
do
{
i+=1;
printf("%d : %c / ",i);
}while (i<66);
chaine[0] = 'S';
chaine[1] = 'a';
chaine[2] = 'l';
chaine[3] = 'u';
chaine[4] = 't';
chaine[5] = '\0';
printf("%s \n",chaine);
return 0;
}
Re: maxiNoob apprend le C
Je dirais ici (mais je suis très rouillé en C) :
printf("%d : %c / ",i);
==> tu demandes à afficher deux variables (%d et %c), mais tu n'en listes qu'une seule après (i)
printf("%d : %c / ",i);
==> tu demandes à afficher deux variables (%d et %c), mais tu n'en listes qu'une seule après (i)
Symoon- Messages : 779
Date d'inscription : 26/04/2014
Re: maxiNoob apprend le C
Trop fort !!
effectivement avec 2 variables ça marche
effectivement avec 2 variables ça marche
- Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char lettre = 65;
printf("lettre: %c \n",lettre);
printf("code ASCII: %d \n",lettre);
char nom[]="Denis";
printf("%s \n",nom);
char i=64;
do
{
i+=1;
printf("%d : %c / ",i,i);
}while (i<122);
return 0;
}
Re: maxiNoob apprend le C
Bon je suis toujours dans les premiers cours que je triture et où je me mélange un peu les pinceaux avec une syntaxe un peu énigmatique, mais surtout j'entrevoie le principe des pointeurs enfin il me semble, dites moi si je me trompe:
les fonctions en C sont évidemment puissantes, mais elles ont un énorme défaut c'est qu'elles travaillent avec des copies des variables, ce qui ne permet pas de les modifier aisément, donc si je comprends bien les pointeurs, en utilisant l'adresse des variables on peut du coup les modifier directement en supprimant ces copies ? c'est ça ?
les fonctions en C sont évidemment puissantes, mais elles ont un énorme défaut c'est qu'elles travaillent avec des copies des variables, ce qui ne permet pas de les modifier aisément, donc si je comprends bien les pointeurs, en utilisant l'adresse des variables on peut du coup les modifier directement en supprimant ces copies ? c'est ça ?
Re: maxiNoob apprend le C
Utiliser les pointeurs en argument de fonction a deux avantages.
Voici un exemple de fonction qui cherche à remplacer un élément dans une structure :
- Dans ce cas on utilise une copie de la structure en argument, si la structure fait plusieurs kilo-octets tu images le gaspillage de mémoire et de temps processeur pour la dupliquer.
D'ailleurs certains compilateurs, par défaut, indiquent une erreur de compilation.
- Second problème, si tu veux modifier la structure source tu es à nouveau obligé de retourner une copie de la structure
Voici une bonne fonction :
- L'argument est un pointeur, il ne fait que 4 octets (sur un système 32bits) et tu peux directement modifier son contenu.
- En retour de fonction tu peux utiliser le int par exemple indiquer le nombre d'éléments modifiés.
Mais l'utilisation des pointeurs n'est pas toujours indispensable:
Dans ce cas utiliser des pointeurs n'a aucun intérêt, un char fait un octet (contre 4 pour un pointeur) et on a pas besoin de modifier les valeurs d'origine.
Voici un exemple de fonction qui cherche à remplacer un élément dans une structure :
- Code:
SBigData findAndReplaceElement(SBigData pListOfElements, SSmallElement pElement);
- Dans ce cas on utilise une copie de la structure en argument, si la structure fait plusieurs kilo-octets tu images le gaspillage de mémoire et de temps processeur pour la dupliquer.
D'ailleurs certains compilateurs, par défaut, indiquent une erreur de compilation.
- Second problème, si tu veux modifier la structure source tu es à nouveau obligé de retourner une copie de la structure
Voici une bonne fonction :
- Code:
int findAndReplaceElement(SBigData* pListOfElements, SSmallElement* pElement);
- L'argument est un pointeur, il ne fait que 4 octets (sur un système 32bits) et tu peux directement modifier son contenu.
- En retour de fonction tu peux utiliser le int par exemple indiquer le nombre d'éléments modifiés.
Mais l'utilisation des pointeurs n'est pas toujours indispensable:
- Code:
char Addition(char a, char b)
{
return a + b;
}
Dans ce cas utiliser des pointeurs n'a aucun intérêt, un char fait un octet (contre 4 pour un pointeur) et on a pas besoin de modifier les valeurs d'origine.
Arnoric- Messages : 4
Date d'inscription : 15/06/2014
Age : 48
Re: maxiNoob apprend le C
Raah, j'ai mal à la tete rien qu'à penser aux pointeurs en C.
Courage Maximus. Tu utilises quel outil de programmation : OSDK ou CC65 ?
Courage Maximus. Tu utilises quel outil de programmation : OSDK ou CC65 ?
_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
Re: maxiNoob apprend le C
Merci Arno pour ton exemple
Didier > commençons pas le B A BA, j'utilise codeblocks
_____________________________
j'ai laissé le cours de coté pour faire des exercices et franchement c'est dur de dur, en plus j'ai parfois des plantages du programme sans un indice sur sa cause, pas de message d'erreur
Je m'exerce à la gestion des chaines de caractères et là le prog plante au 2e appel de la fonction de saisie, comme on ne peut pas réaffecter une chaine de caractère, je bidouille, c'est surement pas la bonne façon de faire, mais tout ça me sert à apprendre les bases et à mémoriser cette syntaxe barbare.
est ce un souci avec la taille du tableau text[] ?
ça rend fou au début non ? tiens voila l'effet "C" :
Didier > commençons pas le B A BA, j'utilise codeblocks
_____________________________
j'ai laissé le cours de coté pour faire des exercices et franchement c'est dur de dur, en plus j'ai parfois des plantages du programme sans un indice sur sa cause, pas de message d'erreur
Je m'exerce à la gestion des chaines de caractères et là le prog plante au 2e appel de la fonction de saisie, comme on ne peut pas réaffecter une chaine de caractère, je bidouille, c'est surement pas la bonne façon de faire, mais tout ça me sert à apprendre les bases et à mémoriser cette syntaxe barbare.
- Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void saisieMot(char text[], char question[]);// fonction de saisie d'un mot
int main()
{
char text[20], question[20], chaine[100];
char question1[]="nom", question2[]="prenom";// items du formulaire
strcpy(question, question1);
saisieMot(text,question);
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
printf("%s\n\n",chaine);
printf("la chaine a une longueur de %d caracteres\n\n", strlen(chaine));// fonction longueur de la chaine
strcpy(question, question2);// ça buggue ici je pense
saisieMot(text,question);
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
return 0;
}
void saisieMot(char text[], char question[])
{
printf("Veuillez saisir votre %s: ",question);
scanf("%s", text);
}
est ce un souci avec la taille du tableau text[] ?
ça rend fou au début non ? tiens voila l'effet "C" :
Re: maxiNoob apprend le C
Bonjour Maximus,
J'ai réouvert codeblocks et ... n'ai pas trouve de bug dans ton programme. Ci-dessous la recopie avec 2/3 lignes supplémentaires pour réafficher le prénom.
RAS.
J'ai réouvert codeblocks et ... n'ai pas trouve de bug dans ton programme. Ci-dessous la recopie avec 2/3 lignes supplémentaires pour réafficher le prénom.
RAS.
- Code:
int main()
{
char text[20], question[20], chaine[100];
char question1[]="nom", question2[]="prenom";// items du formulaire
strcpy(question, question1);
saisieMot(text,question);
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
printf("%s\n\n",chaine);
printf("la chaine a une longueur de %d caracteres\n\n", strlen(chaine));// fonction longueur de la chaine
strcpy(question, question2);// ça buggue ici je pense
saisieMot(text,question);
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
printf("%s\n\n",chaine);
printf("la chaine a une longueur de %d caracteres\n\n", strlen(chaine));// fonction longueur de la chaine
return 0;
}
_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
Re: maxiNoob apprend le C
c'est vraiment une gymnastique que de ne pas utiliser directement les variables et de devoir jongler avec des pointeurs, ces fonctions ne sont pas très pratiques , mais bon c'est un langage de bas niveau, ce qui veut dire qu'il faut être d'un haut niveau pour le maitriser. Je pense finir le tuto pour avoir une culture et une compréhension de vos codes, mais je pense pas être capable d'écrire Tyrann4 avec, ou dans 1 an ou 2, le temps de passer par toutes les étapes d'apprentissage du langage
Re: maxiNoob apprend le C
maximus a écrit:je pense pas être capable d'écrire Tyrann4
Courage Maximus,
Perso, je n'ai jamais trop utilisé ces instructions d'extension du c.
Je prends OSDK, j'utilise le C pour la structure générale de mon programme et toutes les e/s de l'oric sont gérées directement avec mes routines. C'est vrai que c'est du travail mais cela est plus fiable que de prendre le C pour générer un programme Oric.
_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
Re: maxiNoob apprend le C
voilà ma méthode, je lis le tutoriel en prenant en note les fonctions, puis je fais qq exercices, là j'en suis aux structures de variables, ça c'est balèze sauf que pour initialiser un tableau de structure je suis comment dire ... largué
mon petit header
mon code source
quand je saurai faire ça je dois le faire dans une fonction avec pointeurs
mon petit header
- Code:
#define NB_PERSO 6
typedef struct Hero Hero; // creation du type Hero
struct Hero
{
char name[20];
int race;
int pvi;
int strength;
};
mon code source
- Code:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int main()
{
Hero perso[NB_PERSO-1]; // création d'une variable perso, tableau de 6
int i=0;
for (i=0; i<NB_PERSO-1; i++) // Initialisation (foireuse)
{
perso[i].name = "inconnu";
perso[i].race = 0;
perso[i].pvi = 0;
perso[i].strength = 0;
}
for (i=0; i<6; i++)
{
printf(" nom du hero %d : %s \n",i, perso[i].name);
/*printf("veuillez saisir le nom du hero %s: ",i+1);
scanf("%s",perso[i].name);*/
}
return 0;
}
quand je saurai faire ça je dois le faire dans une fonction avec pointeurs
Re: maxiNoob apprend le C
Maximus: ton application ne plante pas, par contre si tu t'attends que
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
affiche quelque chose, c'est que tu as oublié quelque chose
Conseil, des parametres type
char toto[]
sont plutot à bannir, utilise
char *toto
Même si ça peut paraître bizarre, il est préférable de dire que c'est un pointeur qu'une table de taille indéterminé, ça ne change rien à la façon d'appeler la fonction, mais ça peut changer certains points d'optimisation, surtout sur un compilateur de mauvaise qualité.
Ensuite
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
printf("%s\n\n",chaine);
N'a aucun sens, enfin ça ne sert à rien, et le pire, c'est que tu affiches 3 retours à la ligne avec ton code, je suis pas sur que ça soit très utile
Pourquoi ne pas directement appeler
printf("tu t'appelles %s \n",text);
?
Déjà tu économises une variable (chaine) et aussi du temps de calcul (une seule fonction appelée plutôt que 2)
Après pour ton problème de remplissage de structure,
xxx.yyy = "";
est invalide en C.
En C99 minimum tu peux utiliser cette fonctionalité pour remplir une structure avec des valeurs par défaut:
Et si vraiment il faut le faire au runtime, je conseillerais cette méthode (la plus rapide):
Attention initialiser la table à NB_PERSO - 1, si tu as NB_PERSO étant égal à 10, ta table va être de 9 positions, et non 10. Seul l'indexation est à partir de 0, la création est le nombre d'entrée dans la table, donc si tu en veux 10 il faut mettre 10 et non 9.
Autre possibilité pour ta table de perso, rajouter un champ "valide", ou 0 est in perso invalide, autre que 1 un perso valide, l'initialisation du tableau se fait d'une manière encore plus simple:
memset(&perso[0], 0, sizeof(Hero) * NB_PERSO);
Ce qui va remplir la zone mémoire correspondante à ton tableau d'octet 0, soit tout, en gros tout mettre à zéro.
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
affiche quelque chose, c'est que tu as oublié quelque chose
Conseil, des parametres type
char toto[]
sont plutot à bannir, utilise
char *toto
Même si ça peut paraître bizarre, il est préférable de dire que c'est un pointeur qu'une table de taille indéterminé, ça ne change rien à la façon d'appeler la fonction, mais ça peut changer certains points d'optimisation, surtout sur un compilateur de mauvaise qualité.
Ensuite
sprintf(chaine,"tu t'appelles %s \n",text);// fonction d'écriture dans une chaine
printf("%s\n\n",chaine);
N'a aucun sens, enfin ça ne sert à rien, et le pire, c'est que tu affiches 3 retours à la ligne avec ton code, je suis pas sur que ça soit très utile
Pourquoi ne pas directement appeler
printf("tu t'appelles %s \n",text);
?
Déjà tu économises une variable (chaine) et aussi du temps de calcul (une seule fonction appelée plutôt que 2)
Après pour ton problème de remplissage de structure,
xxx.yyy = "";
est invalide en C.
En C99 minimum tu peux utiliser cette fonctionalité pour remplir une structure avec des valeurs par défaut:
- Code:
typedef struct Hero Hero; // creation du type Hero
struct Hero
{
char name[20];
int race;
int pvi;
int strength;
};
Hero perso[NB_PERSO] = {
{
.name = "inconnu";
.race = 0;
.pvi = 0;
.strength = 0;
},
[...]
};
Et si vraiment il faut le faire au runtime, je conseillerais cette méthode (la plus rapide):
- Code:
void init(void)
{
Hero perso[NB_PERSO];
Hero defaultValue = {
.name = "inconnu";
.race = 0;
.pvi = 0;
.strength = 0;
}
int i;
for(i = 0; i < NB_PERSO; i++)
{
memcpy(&(perso[i]), &defaultValue, sizeof(Hero));
}
};
Attention initialiser la table à NB_PERSO - 1, si tu as NB_PERSO étant égal à 10, ta table va être de 9 positions, et non 10. Seul l'indexation est à partir de 0, la création est le nombre d'entrée dans la table, donc si tu en veux 10 il faut mettre 10 et non 9.
Autre possibilité pour ta table de perso, rajouter un champ "valide", ou 0 est in perso invalide, autre que 1 un perso valide, l'initialisation du tableau se fait d'une manière encore plus simple:
memset(&perso[0], 0, sizeof(Hero) * NB_PERSO);
Ce qui va remplir la zone mémoire correspondante à ton tableau d'octet 0, soit tout, en gros tout mettre à zéro.
Godzil- Messages : 107
Date d'inscription : 20/01/2013
Age : 42
Localisation : Entre France et UK
Re: maxiNoob apprend le C
merci godzil d'une réponse aussi détaillée, il va me falloir la semaine (de vacances) pour intégrer tout ça, c'est quand même hyper plus complexe que mon petit BASIC
Re: maxiNoob apprend le C
argh j'essaie ta méthode avec une fonction:
ça marche pas je prends ça en messages d'erreur:
- Code:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
void init(void);
int main()
{
Hero perso[NB_PERSO];
init();
int i=0;
for (i=0; i<NB_PERSO; i++)
{
printf(" nom du hero %d : %s \n",i, perso[i].name);
}
return 0;
}
void init(void)
{
Hero perso[NB_PERSO];
Hero defaultValue =
{
.name = "inconnu";
.race = 0;
.pvi = 0;
.strength = 0;
}
int i;
for(i = 0; i < NB_PERSO; i++)
{
memcpy(&(perso[i]), &defaultValue, sizeof(Hero));
}
};
ça marche pas je prends ça en messages d'erreur:
_________________
Re: maxiNoob apprend le C
Here is one 'correct' version of your code with some comments.
Additionally: '//' is C++ to-end-of-line comment, for C comments are: /* .... */, although '//' works too ; )
- Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* this code can be moved to 'main.h' */
/* -- begin 'main.h' */
#define NB_PERSO 10
typedef struct Hero Hero; // creation du type Hero
struct Hero
{
char name[20];
int race;
int pvi;
int strength;
};
/* -- end 'main.h' */
void init(void);
Hero perso[NB_PERSO]; /* this is global variable */
int main(void)
{
int i=0; /* i can be uninitialized here */
init();
for (i=0; i<NB_PERSO; i++)
{ /* if there is only one line you don't need brackets */
printf(" nom du hero %d : %s \n",i, perso[i].name);
}
return 0;
}
void init(void)
{
int i;
Hero defaultValue =
{
.name = "inconnu", /* correct is ',' (not ';') */
.race = 0,
.pvi = 0,
.strength = 0
}; /* this ';' is obligatory */
for(i = 0; i < NB_PERSO; i++)
{
memcpy(&(perso[i]), &defaultValue, sizeof(Hero));
}
} /* ';' here are not needed */
Additionally: '//' is C++ to-end-of-line comment, for C comments are: /* .... */, although '//' works too ; )
iss- Messages : 112
Date d'inscription : 30/10/2014
Re: maxiNoob apprend le C
merci les gars de m'aider, le démarrage c'est toujours le plus ardu, et puis cette ponctuation elle est terrible
ISS ton cade a fonctionné mais la compilation a bien duré 2 minutes
ISS ton cade a fonctionné mais la compilation a bien duré 2 minutes
Re: maxiNoob apprend le C
WOW, 2 min?!?
I see you are using Code:Blocks IDE (good!) but what compiler?
By me it needs <5 sec with mingw32-gcc.
And this is gcc under Linux:
$ time gcc -o test test.c
real 0m0.050s
user 0m0.039s
sys 0m0.006s
And the running program:
$ ./test
nom du hero 0 : inconnu
nom du hero 1 : inconnu
nom du hero 2 : inconnu
nom du hero 3 : inconnu
nom du hero 4 : inconnu
nom du hero 5 : inconnu
nom du hero 6 : inconnu
nom du hero 7 : inconnu
nom du hero 8 : inconnu
nom du hero 9 : inconnu
I see you are using Code:Blocks IDE (good!) but what compiler?
By me it needs <5 sec with mingw32-gcc.
And this is gcc under Linux:
$ time gcc -o test test.c
real 0m0.050s
user 0m0.039s
sys 0m0.006s
And the running program:
$ ./test
nom du hero 0 : inconnu
nom du hero 1 : inconnu
nom du hero 2 : inconnu
nom du hero 3 : inconnu
nom du hero 4 : inconnu
nom du hero 5 : inconnu
nom du hero 6 : inconnu
nom du hero 7 : inconnu
nom du hero 8 : inconnu
nom du hero 9 : inconnu
- Fichiers joints
iss- Messages : 112
Date d'inscription : 30/10/2014
Re: maxiNoob apprend le C
ha ben là ça remarche en 2 secondes p-e que mon windows était ralenti ou l'antivirus parfois me bloque, en tout as merci, il me reste à cogiter des structures à jongler avec pour bien les comprendre et les mémoriser
Sinon dans le tutoriel que je suis, il est interdit d'utiliser les variables globales, on doit utiliser fonctions et pointeurs
Sinon dans le tutoriel que je suis, il est interdit d'utiliser les variables globales, on doit utiliser fonctions et pointeurs
Re: maxiNoob apprend le C
Alors les site/tuto qui disent "les variable globale ou les goto" sont a bannir sont de mauvais tuto.
Les variables globales et les gotos ont des utilisations, il ne faut pas en abuser, et ne pas utiliser une variable globale comme simple parametre d'une fonction, mais il ne faut pas non plus tomber dans l'absurdité ou par exemple la carte d'un jeu est passé en parametre a toutes les fonctions, la on est dans le cas ou une variable globale est bien plus interessantes.
Le goto par exemple est tres utile pour n'avoir qu'un seul point de sortir sur une fonction (et facillite le tracage de fonction, entre autres)
Sinon conseil, non ordre!
Quand ton compilateur te sors une longue liste d'erreur TOUJOURS commencer par la premiere erreur/warning, et une fois corrigé, relancer la compilation, et ainsi de suite.
Une erreur dans la liste peux etre due a des erreurs précédentes dans le code, donc pour eviter de passer des heures a tenter de corriger un truc inutile..
Autre chose important, un warning, meme si il n'empeche pas la compilation est signe qu'il y a potentiellement un probleme, et dans une grosse majorité des cas, un warning est a corriger.
Il est souvent bon d'activer l'option traiter un warning comme une erreur (-Werror) en ligne de commande, -Wall (tous les warnings) est aussi intéressant dans pas mal de cas, en fait pas mal de bugs a l'execution sont due a des warning ignorées.
Les variables globales et les gotos ont des utilisations, il ne faut pas en abuser, et ne pas utiliser une variable globale comme simple parametre d'une fonction, mais il ne faut pas non plus tomber dans l'absurdité ou par exemple la carte d'un jeu est passé en parametre a toutes les fonctions, la on est dans le cas ou une variable globale est bien plus interessantes.
Le goto par exemple est tres utile pour n'avoir qu'un seul point de sortir sur une fonction (et facillite le tracage de fonction, entre autres)
Sinon conseil, non ordre!
Quand ton compilateur te sors une longue liste d'erreur TOUJOURS commencer par la premiere erreur/warning, et une fois corrigé, relancer la compilation, et ainsi de suite.
Une erreur dans la liste peux etre due a des erreurs précédentes dans le code, donc pour eviter de passer des heures a tenter de corriger un truc inutile..
Autre chose important, un warning, meme si il n'empeche pas la compilation est signe qu'il y a potentiellement un probleme, et dans une grosse majorité des cas, un warning est a corriger.
Il est souvent bon d'activer l'option traiter un warning comme une erreur (-Werror) en ligne de commande, -Wall (tous les warnings) est aussi intéressant dans pas mal de cas, en fait pas mal de bugs a l'execution sont due a des warning ignorées.
Godzil- Messages : 107
Date d'inscription : 20/01/2013
Age : 42
Localisation : Entre France et UK
Re: maxiNoob apprend le C
c'est Openclassroom, c'est pour les débutants en C, je pense qu'ils veulent nous inculquer les bases
Bon un peu de repos, plus de C jusqu'à l'année prochaine
Merci de vos conseils
Bon un peu de repos, plus de C jusqu'à l'année prochaine
Merci de vos conseils
Re: maxiNoob apprend le C
Je plussoie Godzil, sur un Oric, avec le peu de mémoire qu'on a il faut absolument utiliser des variables globales et même probablement des goto.
Ca permet d'économiser un max de RAM.
Par contre, pour l'initialisation des structures je pense que ça ne marchera pas ni avec OSDK ni avec LCC65.
Il faut faire à la main, variable par variable.
J'en profite pour souhaiter la bonne année à tout le monde.
Désolé mais j'ai déménagé pendant les vacances et n'ai pas pu suivre le forum.
Ca permet d'économiser un max de RAM.
Par contre, pour l'initialisation des structures je pense que ça ne marchera pas ni avec OSDK ni avec LCC65.
Il faut faire à la main, variable par variable.
J'en profite pour souhaiter la bonne année à tout le monde.
Désolé mais j'ai déménagé pendant les vacances et n'ai pas pu suivre le forum.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: maxiNoob apprend le C
Ha mais je n'ai jamais dit que l'init des structure tel que la version utilisant le C99 etait compatible avec OSDK/CC65.
J'ai bien dit "C99"
Mais meme, il est préférable d'initialiser une structure statiquement, que dynamiquement, autant que possible bien sur, enfin apres c'est un compromis mémoire/temps d'execution.
J'ai bien dit "C99"
Mais meme, il est préférable d'initialiser une structure statiquement, que dynamiquement, autant que possible bien sur, enfin apres c'est un compromis mémoire/temps d'execution.
Godzil- Messages : 107
Date d'inscription : 20/01/2013
Age : 42
Localisation : Entre France et UK
Re: maxiNoob apprend le C
Oui je sais que tu l'as dit mais je pense que C99 c'est un peu du grec pour les non informaticiens donc je préfère insister dessus sachant qu'on est qu'en même sur un forum Oric et que le but ultime de Maximus est de faire Tyrann 4 pour Oric.
Je suis aussi à fond pour les initialisations statiques. Mais avec les compilos pour Oric il faut gérer les inits à l'ancienne comme ça :
J'ai testé sur OSDK et ça marche sans pb.
Maximus, je te conseille rapidement de passer à OSDK pour ne pas prendre d'habitudes sur des trucs qui ne sont pas compatibles.
Je suis aussi à fond pour les initialisations statiques. Mais avec les compilos pour Oric il faut gérer les inits à l'ancienne comme ça :
- Code:
#include <lib.h>
#define NB_PERSO 3
typedef struct Hero Hero; // creation du type Hero
struct Hero
{
char name[20];
int race;
int pvi;
int strength;
};
Hero perso[NB_PERSO] = {
{"inconnu",0,0,0},
{"inconnu",0,0,0},
{"inconnu",0,0,0}
};
void main()
{
int i;
printf("Hello World !\n");
for(i=0; i<NB_PERSO; i++) {
printf("Nom : %s, Race : %d, Vie : %d, Force : %d\n", perso[i].name, perso[i].race, perso[i].pvi, perso[i].strength);
}
}
J'ai testé sur OSDK et ça marche sans pb.
Maximus, je te conseille rapidement de passer à OSDK pour ne pas prendre d'habitudes sur des trucs qui ne sont pas compatibles.
Hialmar- Admin
- Messages : 840
Date d'inscription : 03/03/2014
Age : 53
Localisation : Toulouse
Re: maxiNoob apprend le C
Hum, a mon sense il est plus simple d'appresndre avec un compilo qui ne fait pas des conneries 1 fois sur 2
OSDK fait des miracles de fournir du C pour l'Oric, mais il a quand meme pas mal de soucis pas tres amusant pour un débutant
OSDK fait des miracles de fournir du C pour l'Oric, mais il a quand meme pas mal de soucis pas tres amusant pour un débutant
Godzil- Messages : 107
Date d'inscription : 20/01/2013
Age : 42
Localisation : Entre France et UK
Re: maxiNoob apprend le C
Bonjour à tous
100 pour 100 d'accord avec Patrice. J'aurais fait pareil et cela est assez lisible je trouve.
je me demande juste quelquefois si je ne devrait pas tester cc65 qui permettrait en plus de coder sur Apple par exemple en même temps.
Là où je flanche mais je n'ai pas trop testé c'est dans l'utilisation de pointeurs.
Par exemple puis-je avoir :
_ ma structure du perso qui adresse $9000 zone de datas de mon programme et à d'autres moments je donne la même zone à une autre structure de données
_ ou vu différemment ; un programme noyau chargé de $1000 a $2000 et des modules programme A, B ... chargés en $2000 a tour de role qui adressent des structures stockées en $9000
je ne sais pas si je suis clair.
didier
100 pour 100 d'accord avec Patrice. J'aurais fait pareil et cela est assez lisible je trouve.
je me demande juste quelquefois si je ne devrait pas tester cc65 qui permettrait en plus de coder sur Apple par exemple en même temps.
Là où je flanche mais je n'ai pas trop testé c'est dans l'utilisation de pointeurs.
Par exemple puis-je avoir :
_ ma structure du perso qui adresse $9000 zone de datas de mon programme et à d'autres moments je donne la même zone à une autre structure de données
_ ou vu différemment ; un programme noyau chargé de $1000 a $2000 et des modules programme A, B ... chargés en $2000 a tour de role qui adressent des structures stockées en $9000
je ne sais pas si je suis clair.
didier
_________________
DidierV - CEO Mag
alias coco.oric sur Defence-Force
Page 1 sur 2 • 1, 2
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 2
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Jeu 21 Mar 2024 - 8:51 par Dom50
» carte mère Oric (re)tracée
Mar 5 Mar 2024 - 18:54 par kenneth
» Meurtre à Grande Vitesse
Dim 25 Fév 2024 - 5:09 par Iurius
» ORIC-1 sur LE BON COIN
Ven 23 Fév 2024 - 23:01 par Mcar
» ORIC ATMOS sur LE BON COIN
Dim 4 Fév 2024 - 12:06 par kiwilevrai
» Problème d'affichage des couleurs avec un Oric Atmos
Sam 27 Jan 2024 - 1:26 par pierbail
» Bienvenue dans le Forum des Oriciens
Mar 9 Jan 2024 - 12:33 par Dom50
» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Ven 29 Déc 2023 - 14:13 par Arcade-des-Monts
» Bonnes fêtes
Mar 26 Déc 2023 - 10:21 par Dom50
» Murders in Venice / Meutres à Venise
Sam 18 Nov 2023 - 22:44 par retroric
» Un clavier PS/2 pour tester un ORIC
Dim 27 Aoû 2023 - 9:49 par Voyageur
» Disquette 3" Sedoric
Mar 1 Aoû 2023 - 14:22 par AtomeX
» faire un 6502 avec des phototransistor
Dim 16 Juil 2023 - 17:26 par Voyageur
» Oricutron linux et DSK
Jeu 29 Juin 2023 - 18:34 par Voyageur
» No Problem !
Dim 25 Juin 2023 - 17:53 par Voyageur