Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Все ли можно написать на С?? 
:(
    Опции темы
LuckLess
Дата 21.1.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Есть функция , которая принимает переменное количество аргументов...
когда ее вызываешь 1-ый раз , она генерит число.
Это число означает , какое количество параметров , начинающихся с 1 и последовательно
увеличивающихся на 1 ей нада передать чтобы она вернула 1:)
задача : можно ли узнать это сгенерированное число используя только С.


Я решил задачу , но использую ассемблер немнога...


Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>

int funnyfunc(int a,...){
int i,g,*gg=&g,j,*fs=&a;
static int rnd=0;
srand(GetTickCount());
while (rnd==0){
rnd=rand();
if (rnd!=0) {rnd = ((double)rnd/(double)RAND_MAX)*15;} else {rnd=0;}
printf("Nuzna posled iz %d elementov \n",rnd);
}


for (i=0,j=1;i<rnd;i++,j++){
   if (*(fs+i)!=j) return 0;
}
return 1;
}


void main(void){
int j,i=0,k,rez;
do{
i++;
j=i;

for (k=0;k<i;k++){
   _asm{
push j;
dec j;
   }
}

_asm{call funnyfunc;
 mov rez,eax }

}while(!rez);

printf("Yuppi E , posl iz %d elementov",i);

_getch();
}


Это сообщение отредактировал(а) LuckLess - 21.1.2005, 12:41
PM MAIL   Вверх
S.A.P.
Дата 21.1.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Цитата(LuckLess @ 21.1.2005, 12:36)
последовательно
увеличивающихся на 1 ей нада передать чтобы она вернула 1:)
вот здесь я запутался smile . Давай по русски.

PM MAIL   Вверх
LuckLess
Дата 21.1.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



т.е. функция генерит случайное число ,
есло оно 5 то ее нада вызвать
funnyfunc(1,2,3,4,5) чтобы она вернула 1
если число - 9 то
funnyfunc(1,2,3,4,5,6,7,8,9)...

PM MAIL   Вверх
DENNN
Дата 21.1.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



ARGC, ARGV
Например функции printf, scanf

PM ICQ   Вверх
LuckLess
Дата 21.1.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



DENNN
поясни плз..
PM MAIL   Вверх
DENNN
Дата 21.1.2005, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Сорри. Объяснение такое сумбурное что я решил ты про функции с переменным числом аргументов не знаешь.

PM ICQ   Вверх
Unknown_Error
Дата 21.1.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 3.1.2005

Репутация: нет
Всего: нет



Хм... хорошая задачка smile
Первое, что приходит в голову, так это создать дин. массив и передавать в функцию указатель, вместо переменного кол-ва параметров. smile
PM MAIL ICQ   Вверх
S.A.P.
Дата 21.1.2005, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



LuckLess я так и не понял твоей задачи. Тебе нужно узнать, сколько параметров передано в функцию?
PM MAIL   Вверх
DENNN
Дата 21.1.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Нет. Ему нужно динамически формировать количество параметров.
То есть на этапе компиляции количество параметров функции не известно.
Мне тоже в голову не приходит ничего кроме передачи указателя динамического массива.
Фактически тогда не нужна функция с переменным числом аргументов.
PM ICQ   Вверх
S.A.P.
Дата 21.1.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



НУ так то да. Более правильно будет принимать указатель на параметры и их количество...
PM MAIL   Вверх
bel_nikita
Дата 21.1.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Вот, такое есть
Код

#include <stdio.h>
#include <stdarg.h>
int average( int first, ... );
 
/* Returns the average of a variable list of integers. */
int average( int first, ... )
{
  int count = 0, sum = 0, i = first;
  va_list marker;

  va_start( marker, first );     /* Initialize variable arguments. */
  while( i != -1 )
  {
     sum += i;
     count++;
     i = va_arg( marker, int);
  }
  va_end( marker );              /* Reset variable arguments.      */
  return( sum ? (sum / count) : 0 );
}


int main(int argc, char* argv[])
{
  /* Call with 3 integers (-1 is used as terminator). */
  printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

  /* Call with 4 integers. */
  printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

  /* Call with just -1 terminator. */
  printf( "Average is: %d\n", average( -1 ) );
 
  return 0;
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
LuckLess
Дата 22.1.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Это ясно , что можно принимать указатель на пераметры , и их количество , и что так правильно делать , но хотелось бы понять , возможно ли както решить задачу именно с этой функцией.
Моэно ли получить регистр стека , потом записать по адресам , полученным из регистра стека нужные значения , а потом вызвать функцию..

пару вопросов :
1) регистр стека - SS , но он указывает на начало стека , а где храниться смещение ??
2) можно ли его(смещение) изменять самому?

если да то тогда можно записапть в стек 2,3,4, сдвинуть смещение на 3 , и вызвать funnyfunc(1) , и тогда можно будет динамически подбирать нужое кол-во параметров...
PM MAIL   Вверх
Unknown_Error
Дата 23.1.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 3.1.2005

Репутация: нет
Всего: нет



Цитата(LuckLess @ 22.1.2005, 17:52)
1) регистр стека - SS , но он указывает на начало стека , а где храниться смещение ??
2) можно ли его(смещение) изменять самому?


Да, ты можешь получить адрес первого передаваемого элемента в функцию с помощью взятия адреса "&"

Код

int function(int first, ...)
{
    int *Pointer = &first;
    Pointer++;
     ...
}


Это сообщение отредактировал(а) Unknown_Error - 23.1.2005, 12:24
PM MAIL ICQ   Вверх
LuckLess
Дата 23.1.2005, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Unknown_Error
да ты не понял...
хочу сделать чтото вроде ...
Код

int a=hz; //<----- получаю адрес стека , равный SS+смещение.
int *b=&a;
*(b--)=4;
*(b--)=3;
*(b--)=2;
hz-=3;    //<----- уменьшаю смещение стека.
funnyfunc(1);

и это будет тоже самое ,что еслиб я просто вызвал
funnyfunc(1,2,3,4);

тока не знаю как реализовать строчки
int a=hz;
и
hz-=3;
...

Это сообщение отредактировал(а) LuckLess - 23.1.2005, 23:18
PM MAIL   Вверх
Nastya
Дата 24.1.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



если честно, мало что пняла. но тчно знаю можно без асемдлер.
Если надо узнать сколько раз вызывалась фунция. используем статическую переменную
Если надо передавать переменное число параметров то используем ...
Если число параметров сопределяется во время исполнения, то динамический массив указаетлей.
Если при этом параметры раного типа, то массив указателей на void


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.