LINUX.ORG.RU

[c][gtk]помогите исправить ошибку

 ,


0

1

Я пиарил свой проект HardInform в этом треде: Требуются добровольцы в проект По результатам обсуждения пошел разделять программу на две части. Информация о процессоре теперь передается через пайп от ядра к гую, но в структуре, где хранится распарсенная информация о процессоре (user_data->info_db->cpu_info_db) вместо нормальных строк хранятся какие-то хреноглифы, в каком виде и отображаются в гуе. Я добавил вывод распарсенной информации в консоль, но там то же самое. Помогите, пожалуйста, кто может. http://github.com/inish777/HardInform в ветке bipartition

★★

Мало кто захочет ковыряться в твоей поделке и вникать, что к чему. Так что лучше обрисуй тут общую схему, последовательность вызовов, при которой наблюдается косяк, чтобы было проще сориентироваться.

yoghurt ★★★★★
()

Лучше покажи здесь, как пишешь/читаешь, если ошибка проявляется на этом этапе.

И добавь *~ в .gitignore.

unsigned ★★★★
()
Ответ на: комментарий от yoghurt

при запуске гуя вызывается функция parse_info (), из которой вызывается функция parse_cpu (), которая открывает пайп с ядром, расковыривает информацию и распихивает ее в структуру info_db->cpu_info_db. Когда я клацаю по колонке Computer->CPU в левом дереве, в правом дереве функцией cpu_information () выводится информация из user_data->info_db->cpu_info_db(user_data->infodb является указателем на infodb, обьявленную в функции main). Вот тут косяки и проявляются.

netcat ★★
() автор топика
Ответ на: комментарий от unsigned
void parse_cpu (info* info_db)
{
  FILE* pipe = popen ("HardInform -c", "r");
  char* ch = (char*) malloc (MAXLEN);
  info_db->cpu_info_db = (cpu_info**) malloc (sizeof (cpu_info*));
  memset (info_db->cpu_info_db, 0, sizeof (cpu_info));
  int x = 1;
  while (fgets (ch, MAXLEN,pipe) != NULL)
    {
      if (!strncmp (ch, "\tCPU", 4))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->cpu = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->cpu, &ch[6]);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db,sizeof (cpu_info) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->cpu = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->cpu, &ch[6]);
	    }
	}
      if(!strncmp (ch, "\t\tProcessor type", 16))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->processor_type = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->processor_type, ch);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db, sizeof (cpu_info*) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->processor_type = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->processor_type, ch);
	    }
	}
      if(!strncmp (ch, "\t\tModel name", 12))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->model_name = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->model_name, &ch[14]);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db, sizeof (cpu_info*) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->model_name = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->model_name, &ch[14]);
	    }
	}
      if(!strncmp (ch, "\t\tCurrent processor speed in MHz", strlen ("\t\tCurrent processor speed in MHz")))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->current_proc_speed_mhz = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->current_proc_speed_mhz, &ch[strlen("\t\tCurrent processor speed in MHz") + 2]);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db, sizeof (cpu_info*) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->current_proc_speed_mhz = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->current_proc_speed_mhz, &ch[strlen("\t\tCurrent processor speed in MHz") + 2]);
	    }
	}
      if (!strncmp (ch, "\t\tProcessor cache size", strlen ("\t\tProcessor cache size")))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->cpu = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->cpu, &ch[strlen ("\t\tProcessor cache size") + 2]);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db, sizeof (cpu_info*) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->cpu = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->cpu, &ch[strlen ("\t\tProcessor cache size") + 2]);
	    }
	}
      if (!strncmp (ch, "\t\tProcessor speed in Bogomips", strlen ("\t\tProcessor speed in Bogomips")))
	{
	  if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) == x)
	    {
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof(cpu_info));
	      info_db->cpu_info_db[x]->current_proc_speed_bgmps = (char*)malloc (MAXLEN);
	      strcpy(info_db->cpu_info_db[x]->current_proc_speed_bgmps, &ch[strlen ("\t\tProcessor speed in Bogomips") + 2]);
	    }else if ((sizeof(info_db->cpu_info_db) / sizeof (cpu_info*)) < x)
	    {
	      info_db->cpu_info_db = (cpu_info**) realloc (info_db->cpu_info_db, sizeof (cpu_info*) * x);
	      info_db->cpu_info_db[x] = (cpu_info*) malloc (sizeof (cpu_info));
	      info_db->cpu_info_db[x]->current_proc_speed_bgmps = (char*) malloc (MAXLEN);
	      strcpy (info_db->cpu_info_db[x]->current_proc_speed_bgmps, &ch[strlen ("\t\tProcessor speed in Bogomips") + 2]);
	    }
	}
    }
  pclose (pipe);
}
int cpu_information (data* user_data, int pos)
{
  GtkTreeIter iter[2];
  if (user_data->info_db->cpu_info_db != NULL)
    for (int x = 0; x <= (sizeof (user_data->info_db->cpu_info_db) / sizeof (cpu_info*)); x++)
      {
	if (user_data->info_db->cpu_info_db[x] != NULL)
	  {
	    if (user_data->info_db->cpu_info_db[x]->cpu != NULL)
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[0],NULL, pos, 0, "CPU", 1, user_data->info_db->cpu_info_db[x]->cpu, -1);
	    if (user_data->info_db->cpu_info_db[x]->processor_type != NULL)
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos + 1, 0,"Processor type" , 1, user_data->info_db->cpu_info_db[x]->processor_type, -1);
	    printf("%s\n",  user_data->info_db->cpu_info_db[x]->cpu);
	    printf("%s\n", user_data->info_db->cpu_info_db[x]->processor_type);
	    /*gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
	      gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);*/ 
	  }
      }
  return 0;
}
netcat ★★
() автор топика
Ответ на: комментарий от netcat
info_db->cpu_info_db = (cpu_info**) malloc (sizeof (cpu_info*));
memset (info_db->cpu_info_db, 0, sizeof (cpu_info));

Здесь уже ошибка (при желании и две), найдешь?

unsigned ★★★★
()
Ответ на: комментарий от netcat

о, теперь оба ядра процессора отображаются, после того, как я эту строку удалил. но все равно хреноглифы в описании.

netcat ★★
() автор топика
Ответ на: комментарий от netcat

1. Чтобы выделять обнуленную память, юзай calloc.

2.

info_db->cpu_info_db = (cpu_info**) malloc (sizeof (cpu_info*) * размер_вектора);
Размер вектора ты на этапе выделения памяти не знаешь. Значит надо плясать с realloc-ами.

3. Используй список вместо вектора.

geekless ★★
()

Зачем тебе вообще Си для такой задачи? Пиши на питоне/руби.

geekless ★★
()
Ответ на: комментарий от netcat

Раз у тебя gtk - лучше использовать g_malloc0. Но избыток malloc/realloc намекает, что ты что-то делаешь не так.

Работа с текстом на C - худшая из задач, с которыми я сталкивался. Советовал бы любой другой язык.

unsigned ★★★★
()

Мне странно: программа на gtk, но без glib. Зачем все эти низкоуровневые пляски с выделением памяти? Что мешает использовать GArray, GPtrArray и другие G-контейнеры?

akk ★★★★★
()

А в целом ты не с того конца подходишь к проблеме. Ты хочешь
1) показ информации о системе;
2) графический;
3) с тестами.

Пункт 1 — это lshw и hwinfo.

Пункт 2 — берем любую графическую обёртку к одной из этих утилит и дорабатываем. (Не знаю, что за обёртки конкретно, но уверен, что они есть. Как минимум, в какой нибудь Сюзе, наверняка.)

Пункт 3 — единственное, что тебе придётся написать с нуля, если ничего подобного нет. После чего добавляем поддержку этой программы для тестов в пункт 2, и получаем желаемую тобой программу.

geekless ★★
()
Ответ на: комментарий от geekless

Ты прав, но комплекс Дениса не дает покоя(свое ядро, браузер, etc. с шахматами и поэтессами)

netcat ★★
() автор топика
Ответ на: комментарий от netcat

ну вот объясните мне, ну почему

if(!strncmp (ch, «\t\tModel name», 12))

но

if(!strncmp (ch, «\t\tCurrent processor speed in MHz», strlen («\t\tCurrent processor speed in MHz»)))

???

ananas ★★★★★
()
Ответ на: комментарий от ananas

Во втором случае не осилил в уме пересчитать символы же.

geekless ★★
()
Ответ на: комментарий от netcat

> Ты прав, но комплекс Дениса не дает покоя(свое ядро, браузер, etc. с шахматами и поэтессами)

Денис как раз безыскусно крал чужое.

geekless ★★
()
Ответ на: комментарий от geekless

Не, я про первый тред, где он хотел все свое сам сделать.

netcat ★★
() автор топика

Ну раз уж меня опять отправляют все переписывать, вы хоть посоветуйте хорошие книги по питону, pygtk, и функциональному программированию

netcat ★★
() автор топика
Ответ на: комментарий от netcat

по pygtk воплне хватает официального тьюториала и devhelp-а

ananas ★★★★★
()
Ответ на: комментарий от netcat

Не слушай этих неудачников. С именно тот язык который подходит почти для всего. Хоть работа с текстом и не является коньком С, но все с ней в порядке, просто рутины получается чуть больше чем в пэтонах... Но твой код всеравно немного ужасен :)

Я бы рекомендовал пересмотреть концепцию хранения данных, и обернуть это все в обычный односвязный список с группой доп функций по его управлению.
А еще рекомендовал бы не копипастить код из ифа в иф, а сделать отдельную функцию :)

Jetty ★★★★★
()
Ответ на: комментарий от unsigned

>Работа с текстом на C - худшая из задач, с которыми я сталкивался. Советовал бы любой другой язык.

+1

yoghurt ★★★★★
()
Ответ на: комментарий от Jetty

Один говорит, что C не кошерен для обработки текста, второй говорит, что таки кошерен. Посмотрим, что еще скажут онолитеги.

netcat ★★
() автор топика
Ответ на: комментарий от netcat

Кошерен/некошерен дело десятое. Важно то что при твоем объеме текстовой обработки тебе даже асемблер подойдет. :) Не говоря уж про С

Jetty ★★★★★
()
Ответ на: комментарий от geekless

у меня знания по python чисто теоретические, а ruby я вообще не знаю. а сути ООП вообще не понимаю

netcat ★★
() автор топика
Ответ на: комментарий от netcat

С управлением памятью в С все просто отлично :) Ты САМ управляешь. Другое дело что рутинно, это да... :)

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

Говнокодеру совершенно без разницы, на каком языке строгать говногод. Если у ТСа нет врожденных замашек говнокодера, то выучив руби или «пэтон», он им и не станет.

geekless ★★
()
Ответ на: комментарий от netcat

Полагаю, у тебя нет «чувства языка». Внутренного понимания, как на этом языке единственно правильно выразить ту или иную идею.

Так что сменив Си на любой другой язык, ты ничего не потеряешь в своих навыках, зато получишь возможность ознакомиться с более мощным инструментом, лучше подходящим под твою текущую задачу.

geekless ★★
()
Ответ на: комментарий от netcat

> Т.е. я говнокодер? Или случай операбельный?

годков-то тебе сколько, говнокодер? вряд ли больше 20-ти. а в этом возрасте пока что о кодере, с приставками или без говроить рано

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.