Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2020, 17:11   #1
Liza256
 
Регистрация: 19.04.2018
Сообщений: 6
Вопрос Как исправить ошибку?

Нужно сохранить результат игры в файл. У нас есть таблица рейтинга (5 мест, упорядоченно).
Если нет файла, то создать.
В функцию передается имя и результат.

Проблема выглядит так: incompatible types when assigning to type char 20 from type char *. (строка с ошибкой помечена стрелкой).
strncpy и strcpy не помогли.

Как сделать так, чтобы код работал? Как ещё можно записать результаты в файл в данном случае?

Язык си.
Код:
#include <stdio.h>
#include <string.h>
int addResult (char name, int point) { 
      FILE *file = fopen("Result.txt","rb+");
      if(!file){ 
        printf("I didnt find the file. I will make it");
        if(!(file = fopen("Result.txt","wb+"))){
             printf("Error");
        }
        }else{
        struct  res{
            char name[20];
            int point;
        };
    struct res gamers [5]; 
        int i=0;
    int k=-1;
      while ( fscanf(file,"%s%d",  gamers[i].name, &(gamers[i].point))!= EOF){
         // printf("%d) %s %d\n", (i+1), gamers[i].name, gamers[i].point); 
          if( (k==-1) && (point >= gamers[i].point)){
            k=i;
          }
          i+=1;
      }
      printf ("im before if(k!=-1){");
      if(k!=-1 && k<i){
      int z;
      char theMainName[20];
      int theMaintPoint = point;
      
      char tNa;
      int tPo;
 
      char tempName[20];
      int tempPoint;
      for(z=k;z<i;z++){
        tempName = gamers[z].name;
        tempPoint = gamers[z].point;
        
       // strncpy(gamers[z].name, theMainName,20);
        
       gamers[z].name = theMainName;<------------------
        gamers[z].point = theMaintPoint; 
        
        theMainName = tempName;
        theMaintPoint = tempPoint;
        printf("%d) %s %d\n", (z+1), gamers[z].name, gamers[z].point); 
      }
      }
      fclose (file);
    }
     return 0; 
}
Liza256 вне форума Ответить с цитированием
Старый 10.01.2020, 08:13   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

если ничего не менять, то как-то так
Код:
#include <stdio.h>
#include <string.h>

#define max_name_len 20

int addResult (char name, int point) { 
      FILE *file = fopen("Result.txt","rb+");
      if(!file){ 
        printf("I didnt find the file. I will make it");
        if(!(file = fopen("Result.txt","wb+"))){
             printf("Error");
        }
        }else{
        struct  res{
            char name[max_name_len];
            int point;
        };
    struct res gamers [5]; 
        int i=0;
    int k=-1;
      while ( fscanf(file,"%s%d",  gamers[i].name, &(gamers[i].point))!= EOF){
         // printf("%d) %s %d\n", (i+1), gamers[i].name, gamers[i].point); 
          if( (k==-1) && (point >= gamers[i].point)){
            k=i;
          }
          i+=1;
      }
      printf ("im before if(k!=-1){");
      if(k!=-1 && k<i){
      int z;
      char theMainName[max_name_len]={};
      int theMaintPoint = point;
      
      char tNa;
      int tPo;
 
      char tempName[max_name_len]={};
      int tempPoint;
      
      for(z=k;z<i;z++){
        //tempName = gamers[z].name;
        strncpy(tempName, gamers[z].name,max_name_len-1);
        tempName[max_name_len-1]='\0';

        tempPoint = gamers[z].point;
        
        //gamers[z].name = theMainName;
        strncpy(gamers[z].name,theMainName,max_name_len-1);
        gamers[z].name[max_name_len-1]='\0';  

        gamers[z].point = theMaintPoint; 
        
        //theMainName = tempName;
        strncpy(theMainName,tempName,max_name_len-1);
        theMainName[max_name_len-1]='\0'; 
        
        theMaintPoint = tempPoint;
        
        printf("%d) %s %d\n", (z+1), gamers[z].name, gamers[z].point); 
      }
      }
      fclose (file);
    }
     return 0; 
}
а если менять, то так

Код:
#include <stdio.h>
#include <string.h>

#define max_name_len 20

int addResult (char name, int point)
{ 
	FILE *file = fopen("Result.txt","rb+");
	if(!file)
	{ 
		printf("I didnt find the file. I will make it");
		if(!(file = fopen("Result.txt","wb+")))
		{
			printf("Error");
		}
	}
	else
	{
		struct s_gamer
		{
			char name[max_name_len];
			int point;
		};
		
		struct s_gamer gamers [5]={}; 
		
		int i=0;
		int k=-1;
		
		while ( fscanf(file,"%s%d",  gamers[i].name, &(gamers[i].point))!= EOF)
		{
			// printf("%d) %s %d\n", (i+1), gamers[i].name, gamers[i].point); 
			if( (k==-1) && (point >= gamers[i].point))
			{
				k=i;
			}
			i+=1;
		}
		
		printf ("im before if(k!=-1){");
		if(k!=-1 && k<i)
		{
			struct s_gamer theMain={};
			struct s_gamer res_temp={};
			
			for(int z=k;z<i;z++)
			{
				res_temp=gamers[z];
				gamers[z]=theMain;
				theMain=res_temp;
				
				printf("%d) %s %d\n", (z+1), gamers[z].name, gamers[z].point); 
			}
		}
		fclose (file);
	}
	return 0; 
}
и заодно становится непонятно, зачем вообще понадобился своп gamers[z] <-> theMain ?
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправить ошибку Camelot_2012 Помощь студентам 7 01.10.2015 09:59
Исправить ошибку imworld Помощь студентам 1 20.02.2012 19:54
как исправить ошибку? Gerain4 Помощь студентам 4 08.12.2011 08:11
как исправить ошибку 205 AndrewPl Помощь студентам 5 06.02.2011 22:20
исправить ошибку на VBA NitriNKa Помощь студентам 1 08.04.2009 22:59