Partage
  • Partager sur Facebook
  • Partager sur Twitter

tableau deux dimensions dynamique

    5 janvier 2021 à 23:02:18

    Bonjour je souhaite créer une base de données ou l'utilisateur insert divers noms ( en utilisant des chars et un simple tableau). Je souhaite faire cela de façon dynamique, et à chaque nouvelle entree augmenter la capacité du tableau ou la réduire en fonction de l'option choisie par l'utilisateur. Ma fonction d'insertion marche bien mais la fonction de suppression ne fonctionne pas et bloque. J'ai tout essayé je n'arrive pas à trouver la solution. C'est pour cela que je fait appel a votre aide.

    Merci

    char** delString(char** database, int length, char* word)
    {
    	int indexTodel = 0;
    	for (int i = 0; i <= length; i++)
    	{
    		if (strcmp(word, database[i]) == 0)
    		{
    			indexTodel = i;
    		}
    	}
    	cout << indexTodel;
    
    	char** temp = new char* [length];
    	int Indextemp = 0;
    	for (int i = 0; i < length; i++)
    	{
    		if (i != indexTodel)
    		{
    			temp[Indextemp++] = new char[strlen(database[i] + 1)];
    			strcpy_s(temp[Indextemp], strlen(database[i] + 1),database[i]);
    		}
    	}
    	return temp;
    
    }
    char** newString(char** database, int length, char* word)
    {
    	char** temp = new char* [length];
    	if (database) // Copying all precedent value
    		for (int i = 0; i < length - 1; i++)
    		{
    			temp[i] = database[i]; // Copy pointer to char
    		}
    
    	temp[length - 1] = new char[strlen(word) + 1]; // PLus one
    	strcpy_s(*(temp + length - 1), strlen(word) + 1, word);
    
    	delete[] database;
    	return temp;
    }
    
    void display(char** database, int length)
    {
    	for (int i = 0; i < length; i++)
    	{
    		for (int j = 0; j < database[i][j] !='\0'; j++)
    		{
    			cout << database[i][j];
    		}
    		cout << endl;
    	}
    }
    
    int main()
    {
    	int lengthDb = 0; int choice = 0;
    	char** database = NULL;
    	char word[50];
    
    	cout << "1.Add" << endl;
    	cout << "2.Delete" << endl;
    	cout << "3.Display" << endl;
    	cout << "4.Exit" << endl;
    	cout << "Enter your choice" << endl;
    	while (cin >> choice && choice != 4)
    	{
    		switch (choice)
    		{
    		case 1:
    			cout << "Enter the name of student to add" << endl;
    			cin.ignore(); cin.getline(word, 50);
    			lengthDb++;
    			database = newString(database, lengthDb, word);
    			display(database, lengthDb);
    			break;
    		case 2:
    			cout << "Enter the name of student to delete" << endl;
    			cin.ignore(); cin.getline(word, 50);
    			lengthDb--;
    			database = delString(database, lengthDb, word);
    			display(database, lengthDb);
    			break;



    -
    Edité par ronytexasranger 5 janvier 2021 à 23:05:24

    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2021 à 23:15:46

      Je souhaite faire cela sans aide de fonctions approprié, et en utilisant des char et non des std:string

      -
      Edité par ronytexasranger 5 janvier 2021 à 23:20:42

      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2021 à 23:33:33

        Alors, allez faire de C, pas du C++.

        En C, on vous demande pas de faire de l'assembleur "embeded" alors que c'est possible.

        Les char en C++, c'est aussi archaïque (pas faite pour les noobs) que l'assembleur "embeded" en C.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          5 janvier 2021 à 23:35:38

          Quelle drole d'idée.

          Il faut tout d'abord savoir que la façon correcte d'allouer des structures à 2 dimensions et à la main, c'est la suivante: https://cpp.developpez.com/faq/cpp/?page=Gestion-dynamique-de-la-memoire#Comment-allouer-dynamiquement-un-tableau-a-plusieurs-dimensions

          Et encore, on n'aborde pas le cas "et si on rajoutait une autre ressource". Bref, si professionnellement on ne joue pas avec des char** de la sorte, ce n'est pas parce que l'on ne sait pas faire. C'est parce que l'on sait que personne ne saura écrire un code correct qui soit maintenable.

          Et vu que l'on n'aime vraiment pas bosser sur ces trucs inmaintenables, tu auras peu de chances d'avoir des réponses avec cette étrange contrainte. Et si vraiment on ne peut pas utiliser std::string, on écrira une version alternative (moins bien) qui nous garantisse une gestion correcte de la mémoire et une facilité accrue sur les opérations classiques comme la concaténation. On n'attaque pas ces problèmes en mélangeant tout mais en décomposant le problème en sous-problèmes indépendants et donc bien plus gérables: une classe pour les chaines d'un coté et une pour les tableaux de l'autre.

          PS: à propos de fonctions dédiées, j'ai comme l'impression que strcpy_s n'existe pas en C++

          -
          Edité par lmghs 5 janvier 2021 à 23:41:19

          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            6 janvier 2021 à 2:26:24

            strcpy_s et toutes les fonctions en _s (pour secure) sont dans la norme C11, mais non intégrée en C++. Malheureusement, elles ne sont disponibles que sur Windows.

            En plus, l'usage est faux ici, le seconde paramètre représente la taille disponible dans la destination alors que c'est la taille de la source qui est passé. Ce qui n'en fait ni plus ni moins qu'un strict équivalent à strcpy.

            https://en.cppreference.com/w/c/string/byte/strcpy

            • Partager sur Facebook
            • Partager sur Twitter

            tableau deux dimensions dynamique

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown