2013-11-22 5 views
1

Меня попросят поместить случайное посев в программу, которая вызывается, когда пользователь вводит в -r. Показано выглядетьСлучайное сеяние seg fault

-r1234567 

Так как глобальная переменная I установить Random = 1234567.

Я добавил это в верхней части моей функции, а также:

printf("Seed: %d\n", Random); 
srand48(Random); 

Каждый раз, когда я использовать -r1234567 мою программу говорит и ошибка сегментации это:

Program received signal SIGSEGV, Segmentation fault. 
____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>, 
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298 
298 ../stdlib/strtol_l.c: No such file or directory. 
(gdb) bt 
#0 ____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>, 
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298 
#1 0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28 
#2 0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238) 
at prog.c:171 
#3 0x0000000000401514 in main (argc=6, argv=0x7fffffffe238) at prog.c:35 
(gdb) up 
#1 0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28 
28 atoi.c: No such file or directory. 
(gdb) up 
#2 0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238) 
at prog.c:171 
warning: Source file is more recent than executable. 

В моей команде, как: дело выглядит следующим образом:

while ((c = getopt(argc, argv, "g:n:a:h:s:d:v:r")) != -1) 

case 'r': Random = atoi(optarg);  break; 

Таким образом, пользователь хочет рандомизировать использование семени. Они делают ./program -r1234567. Затем это переходит в две строки кода, которые я поставил выше, и должен рандомизировать.

Любые предложения?

+0

Просьба показать более полный пример, например показать, что такое «Случайный», и как оно объявлено/определено и возможно назначено. Было бы лучше, если бы вы сделали небольшой, но полный пример, также известный как [SSCCE] (http://sscce.org/). Вы также можете отредактировать свой вопрос, чтобы включить полную откат от отладчика. –

+0

Я добавил bt и попытался объяснить это еще немного. – user081608

+0

В отладчике, когда вы находитесь в кадре # 2 (т. Е. В функции 'getCommandLine'), попробуйте напечатать значение' optarg'. Или, возможно, добавить вызов 'printf', прежде чем вызывать' atoi', чтобы увидеть фактическое значение 'optarg'. –

ответ

2

Ваша проблема является getopt вызов, в том, что вы забыли сказать getopt, что -r аргумент принимает значение:

getopt(argc, argv, "g:n:a:h:s:d:v:r:") 
/*        ^*/ 
/*         | */ 
/*     Add colon here */ 

Из-за этого указатель optarg - NULL, когда вы позвоните - atoi.

+0

Yup thats it! хорошая находка! – user081608

+0

@ user081608 Возьмите это как урок, чтобы всегда публиковать, если возможно, более полный пример.:) Если вы этого еще не сделали, я рекомендую вам прочитать [контрольный список вопросов переполнения стека] (http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist), это поможет вам написать лучшие вопросы в будущем. –

+0

Хорошо, я обязательно сделаю это. Большое спасибо – user081608

0

Вы передаете -r1234567 из командной строки, как вы разбираете его и даете ito atoi?

Если atoi получает «1234567» в качестве аргумента, тогда не должно быть никаких проблем. Можете ли вы вставить логику, которая анализирует argv [1]?

+0

Я не хочу добавлять весь свой код, но я добавил цикл while, чтобы найти случай. – user081608

+0

Проблема в том, что вам не хватает «:» в конце аргумента r ... из-за этого NULL передается atoi .. попробуйте добавить «:» в конце r в getopt !! – Srikanth

0

Объявляют Random как int ?. srand48 берет длинный в качестве аргумента, так что вы должны быть usuing ATOL вместо atoi:

long Random = 42; 
printf("Seed: %d\n", Random); 
srand48(Random); 
+0

Итак, для случая 'r': Random = atoi (optarg); Я делаю atoi -> atol? – user081608

+0

@ user081608 Это не имеет значения. При вызове 'srand48' компилятор сделает неявный приведение' long int'. –

+0

Я получаю формат предупреждения '% d' ожидает аргумент типа 'int', но аргумент 2 имеет тип 'long int' – user081608

0

Проблема в том, что вам не хватает «:» в конце аргумента r ... из-за этого NULL передается atoi .. попробуйте добавить «:» в конце r в getopt !!