CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Comment séparer un string en array de string

stuart4
stuart4
Niveau 5
19 février 2022 à 11:18:59

Bonjour je souhaite séparer un string en plusieurs string retourner ce dernier voici le string dont il est question :

#shadervertex
#version 330 core

layout(location = 0) in vec 4 position;

void main()
{
	gl_Position = position;
};
#shaderfragment
#version 330 core

layout(location = 0) out vec 4 color;

void main()
{
	color = vec4 (1.0, 0, 0, 1.0);
};

Le but étant que a chaque fois que "#shader(nom du shader)" est rencontrer tout ce qui suit jusqu'a ce qu'on atteigne le suivant #shader soit copié dans un array de string et retourne par une fonction qui aurai pour paramètre le num du shader. Par exemple :

char** ParseShader(char* string(celui qui doit être séparé), char* type(par exemple "#shadervertex"))

J'ai déja essayé en utilisant sscanf, strtok, strcpy et strstr mais je ne parviens pas a écrire cette fonction.
De plus chaque string contenue dans le string est de taille différente de ce fait il m'est impossible de le convertir en 2D array comme ceci :

char** ParseShader(char* shader, unsigned int type)
{
    unsigned int i = 0, space = 0;
    for (i = 0; i < strlen(shader); i++)
    {
        if (shader[i] == ' ')
        {
            space++;
        }
    }
    if (char** word = (char**)malloc(sizeof(char*) * (space + 1))) // alloue de la mémoire pour chaque string séparé par un espace dans le string en question
    {
        for (i = 0; i < ???? ; i++) // ici je devrais allouer de la mémoire pour chaque string mais ils ont tous une taille différente que faire ??
        {
            word[i] = (char*)malloc(sizeof(char)* i);
        }
    }
    return NULL;
}

Quelqu'un pourrait-t-il me mettre sur la voie ?

Guybrush81
Guybrush81
Niveau 10
19 février 2022 à 13:18:25

Salut!

Fait plus simple, au lieu de faire
#vertexshader

utilise le préprocesseur de GLSL en faisant:

#version 330 core

#ifdef VERTEX_SHADER

void main() {
...
}

#endif

#ifdef FRAGMENT_SHADER

void main() {
...
}

#endif

Et ensuite tu rajoute à ta string qui contient le code la chaine #define VERTEX_SHADER ou #define FRAGMENT_SHADER suivant le type de shader que tu compile (et tu peux faire la même avec les geometry shader). Tu peux aussi y ajouter à chaque fois #version 330 core comme ca plus besoin de le mettre dans le code du shader (à priori tout tes shaders l'utiliseront).
Ca rend le debug un peu plus compliqué (car les numéro de ligne du fichier et les éventuels retourné par le compilateur ne match plus), mais tu peux comme ca garder tout tes shaders dans le meme fichier!

Pseudo supprimé
Pseudo supprimé 19 février 2022 à 21:48:56

J'ai jamais compris quel était l'intérêt de vouloir regrouper ses shaders dans un seul fichier :(

Ça coûte quoi de lire deux fichiers ? :(

Guybrush81
Guybrush81
Niveau 10
20 février 2022 à 09:17:33

Ça coûte quoi de lire deux fichiers ?

Pas grand chose, mais c'est plus simple à écrire et maintenir.

stuart4
stuart4
Niveau 5
20 février 2022 à 10:14:05

J'ai écris une fonction qui me parait correct mais elle ne fonctionne pas pourriez vous m'éclairer ?

char* ParseShader(const char* shader, const char* type)
{
    unsigned int i = 0;
    char* res = (char*)strstr(shader, type);
    if (res)
    {
        unsigned int char_num = 0;
        unsigned int pos = (res - shader) + strlen(type);
        for (i = pos + 2; shader[i] != '#'; i++)
        {
            char_num++;
        }
        if (char* ret = (char*)malloc((sizeof(char) * char_num) + 2))
        {
            for (i = pos + 2; shader[i] != '#'; i++)
            {
                ret[i] = shader[i];
            }
            
            ret[char_num] = '\0';
            return ret;
        }
        
    }
    return NULL;
}
stuart4
stuart4
Niveau 5
20 février 2022 à 11:25:40

j'ai trouvé le problème cepandant mon code me parait peu optimisé et élégant voici a quoi je suis arrivé :

char* ParseShader(const char* shader, const char* type)
{
    char* res = (char*)strstr(shader, type);
    if (res)
    {
        unsigned int i = 0, char_num = 0, pos;
        pos = (res - shader) + strlen(type);
        for (i = pos + 2; shader[i] != '#'; i++)
        {
            char_num++;
        }
        if (char* ret = (char*)malloc((sizeof(char) * char_num) + 1))
        {
            
            for (i = pos + 2; shader[i] != '#'; i++)
            {
                ret[i-(pos+1)] = shader[i];
            }
            ret[0] = '#';
            ret[char_num] = '\0';
            return ret;
        }
        
    }
    return NULL;
}

Ca fonctionne mais c'est un peu désastreux comme fonction...

Message édité le 20 février 2022 à 11:28:08 par stuart4
godrik
godrik
Niveau 30
20 février 2022 à 16:12:15

Il y a une raison particuliere pour laquelle tu ecris ca en C?

stuart4
stuart4
Niveau 5
20 février 2022 à 17:27:00

Oui car je ne "connais" que le C et je ne souhaite pas apprendre un nouveau language pour le moment.

Guybrush81
Guybrush81
Niveau 10
21 février 2022 à 11:42:51

j'ai trouvé le problème cepandant mon code me parait peu optimisé et élégant voici a quoi je suis arrivé :

Oui en fait tu es coincé car tu cherche le '#' suivant #vertexshader, et donc tu as du rajouté un petit hack pour sauter #version.
Tu peux pas vraiment t'en sortir proprement sans avoir un marqueur de fin, comme justement #if/#endif.

J'insiste, mais utiliser la compilation conditionnel dans ce cas est tout a fait viable, et tu n'a qu'a rajouté le bon define au code.
Sachant que tu pourrais avoir d'autre directive, comme #include, #define, etc dans ton code (et donc ton code actuel ne fonctionnerait plus).

stuart4
stuart4
Niveau 5
23 février 2022 à 20:48:23

Est ce que tu sais comment je pourrai rendre ma fonction plus universelle ?

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment