Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите с языком С

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

slashuz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть структура  
              struct passwd {
                      char    *pw_name;       /* user name */
                      char    *pw_passwd;     /* user password */
              };
есть переменная pw обявленная как  
  struct passwd *pw;
 
есть переменная "r->server->server_uid" с типом int,  
 
как в  pw->pw_name получить строковое значение r->server->server_uid
 

Всего записей: 112 | Зарегистр. 24-01-2003 | Отправлено: 17:46 06-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://forum.ru-board.com/topic.cgi?forum=33&topic=3749#1

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 18:15 06-09-2004
slashuz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хм не очень получается, попробую еще раз сказать что я хочу, к сожалению С я совсем не знаю, только паскаль и перл, поэтому читать Сишный код еще могу чуть, а писать ни в какую  
 
 
 char *execuser;
 struct passwd *pw; // что такое passwd я приводил выше  
 
 
if ((pw = getpwuid(r->server->server_uid)) == NULL) {
{
// Вот здесь в исходном коде сообщение об ошибке и выход
// а мне нужно заполнить pw->pw_name значением  r->server->server_uid
}
 
execuser = pw->pw_name;
 
как это сделать?
 

Всего записей: 112 | Зарегистр. 24-01-2003 | Отправлено: 07:55 07-09-2004 | Исправлено: slashuz, 08:06 07-09-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slashuz

Цитата:
f ((pw = getpwuid(r->server->server_uid)) == NULL) {
// Вот здесь в исходном коде сообщение об ошибке и выход
// а мне нужно заполнить pw->pw_name значением  r->server->server_uid
}

 
Что-то типа:
 

Код:
 
pw = malloc(sizeof(struct passwd));
pw->pw_name = malloc(16);  // Для int должно хватить
sprintf(pw->pw_name, "%d", r->server->server_uid);
 

 
Не забудь потом освободить память для pw->pw_name и pw.
Но вообще как-то через ж... все это. Лучше бы ты алгоритм поменял и не трогал pw.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 08:41 07-09-2004
slashuz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как так память освободить?, в исходном коде дальше вообще про освобождение памяти нет ничего, как так? при использовании  getpwuid() память не надо освобождать, а в твоем методе надо?  
 
А алгоритм изменить не могу, так как там потребуется еще большего знания С, которых у меня и так нет )  
 

Всего записей: 112 | Зарегистр. 24-01-2003 | Отправлено: 09:35 07-09-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slashuz

Цитата:
как так память освободить?, в исходном коде дальше вообще про освобождение памяти нет ничего, как так?

Ну если ты взял у системы память фунцкцией malloc, то после использования (кода уже тебе не надо) положено сделать ее освобождение - вызвать фунцкцию free

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 13:26 07-09-2004
slashuz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хорошо, но как сделали так чтобы используя getpwuid память не надо освобождать?
 
http://www.icewalkers.com/Linux/ManPages/getpwuid-3.html

Всего записей: 112 | Зарегистр. 24-01-2003 | Отправлено: 14:28 07-09-2004
f_serg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slashuz

Цитата:
Хорошо, но как сделали так чтобы используя getpwuid память не надо освобождать?


Цитата:
Но вообще как-то через ж... все это. Лучше бы ты алгоритм поменял и не трогал pw.

Ты же хочешь запихать r->server->server_uid именно в pw->pw_name.
getpwname возвращает указатель на статический буфер и ничего освобождать не надо. В случае ошибки она тебе возвращает нулевой указатель. Так что без malloc() почти никак.
Ну, как вариант:

Код:
static char my_buffer[sizeof(struct passwd) + 16];
...
if ((pw = getpwuid(r->server->server_uid)) == NULL) {
pw = (struct passwd*) my_buffer;
pw->pw_name = (char*) &pw[1];
sprintf(pw->pw_name, "%d", r->server->server_uid);
}

Извращение все это, IMHO.

----------
Serg

Всего записей: 1706 | Зарегистр. 11-09-2002 | Отправлено: 16:48 07-09-2004 | Исправлено: f_serg, 16:49 07-09-2004
slashuz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
) оо спасибо ) решил я свою проблему ) спасибо )

Всего записей: 112 | Зарегистр. 24-01-2003 | Отправлено: 19:08 07-09-2004
JohnC



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите идеей для задачки "простые числа".

Всего записей: 198 | Зарегистр. 14-07-2004 | Отправлено: 11:13 04-10-2004
CamTracer

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
JohnC
Конкретизируй, что за задачка? Простые числа найти от a до b?

Всего записей: 264 | Зарегистр. 07-07-2004 | Отправлено: 12:23 04-10-2004
borisvid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JohnC
Простое число (ака Prime number), число которое делится на  себя и на 1,
например: 1(ингда его считают не простым числом) 3, 5 ,7,11, ….  
 
Для проверки числа мы должны проверить если он делится без остатка на какое либо число от 2 и до его самого. Если  делиться значит число это не простое.
 
(вот функция самой проверки)
 
 
//-----------------------------------------------------------------------------------
void i_prime (int num)
 {int i;
   for (i=2;i<abs(num);i++)
    if (abs(num%i)==0)
     {
      printf ("\nThe number %d is NOT Prime",num);
      return;
     }
     printf("\nThe number %d is Prime",num);
     return;
 }
//-----------------------------------------------------------------------------------

Всего записей: 685 | Зарегистр. 23-05-2003 | Отправлено: 13:04 04-10-2004 | Исправлено: borisvid, 13:07 04-10-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
int prime_to_N(int n)
{
  assert(n > 1);
  int count = 0;  
  char* c = new char[n];  
  memset(c, 1, sizeof(char) * n);
  for (int i=2; i<=n/2; i++)
  {
    if (c[i-1])
    {
      for (int j=i*2; j<=n; j+=i)
      {
        c[j-1] = 0;
      }
    }
  }
  for (int i=1; i<n; i++)
  {
    if (c[i])
    {
      count++;
      cout << (i+1) << endl;
    }
  }
  delete [] c;
  return count;
}
 

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 13:22 04-10-2004 | Исправлено: vndovr, 13:24 04-10-2004
borisvid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2vndovr
Тут спрашивают по теме С а не С++.

Всего записей: 685 | Зарегистр. 23-05-2003 | Отправлено: 14:43 04-10-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
borisvid
Ну так заменить new на malloc, delete на free, cout/endl на printf и перенести объявления переменных до вызова assert. Если C99 можно сразу объявить char c[n] и отказаться от динамического выделения памяти.
Сорри, но это настолько принципиально что алгоритм не будет работать?

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 15:17 04-10-2004
borisvid

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2vndovr
 
Алгоритм работать будет.
Но компиляция пройдет не везде.
А принципиально не постить в этом топике потому что:
1) Тема Помогите с языком С
2) Не все знакомы с С++ и его синтаксом , а тот кто тока начел изучать С запутает себе мозги этим кодом и ничего не поймет. Или  просто сделает
без смыленный Copy&Paste.
 
 

Всего записей: 685 | Зарегистр. 23-05-2003 | Отправлено: 15:55 04-10-2004 | Исправлено: borisvid, 15:57 04-10-2004
JohnC



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Для проверки числа мы должны проверить если он делится без остатка на какое либо число от 2 и до его самого. Если  делиться значит число это не простое.  

 
Да, но тут еще один момент: простое число не должно  
делится ни на одно другое кроме самого себя и единицы без остатка.
Так что без массива, похоже, никак не обойтись.
 
 
Добавлено
vndovr
 
 
Спасибо за оригинальное решение.
Я тут твой код немного преобразовал под язык Си
и вот что у меня получилось:
 
#include<stdio.h>
void main ()
{
int n,i,j;
char c[32767];
clrscr ();
printf("Вывод всех простых чисел, меньшие N\n");
printf("Введите целое положительное число N:");
scanf("%*[^0-9]%d%*[^\n]",&n);
memset(c, 1, sizeof(c));
for (i=2; i<=n/2; i++)
   if (c[i-1])
      for (j=i*2; j<=n; j+=i)
         c[j-1] = 0;      
j=1;
for (i=1; i<n; i++)
  {
  if (c[i])
    {
    if (j%23==0)
       getch ();
    printf("%d\n",i+1);
    j++;
    }
  }
getch ();
}
 
 
Но не ужели в языке СИ никак нельзя создать массив  
динамически, а то такой большой массив с запасом  
задавать как-то криво?

Всего записей: 198 | Зарегистр. 14-07-2004 | Отправлено: 16:57 07-10-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно:

Код:
 
void __cdecl prime_to_N(int n)
{
  char* c = NULL;
  assert (n>1);
  c = (char*) calloc(1, n * sizeof(char));
  for (int i=2; i<=n/2; i++)
  {
    if (!c[i-1])
    {
      for (int j=i*2; j<=n; j+=i)
      {
        c[j-1] = 1;
      }
    }
  }
  for (int i=1; i<n; i++)
  {
    if (!c[i])
    {
      printf("%i\n", i+1);
    }
  }
  free(c);
}
 

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 18:29 07-10-2004 | Исправлено: vndovr, 18:30 07-10-2004
RedMac



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
читай хелп по malloc, realloc, free()
не смешивай со стилем плюсов.
и ещё оператор sizeof

Всего записей: 418 | Зарегистр. 06-08-2003 | Отправлено: 18:41 07-10-2004
JohnC



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vndovr
Все работает. Похоже ты крутой программер, так держать!

Всего записей: 198 | Зарегистр. 14-07-2004 | Отправлено: 20:23 08-10-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите с языком С


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru