ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

20.03.2009, 16:29
|
|
Участник форума
Регистрация: 09.08.2008
Сообщений: 139
Провел на форуме: 560332
Репутация:
15
|
|
А вот имеется строчка FD_ISSET(n->sock,fds);
на нее ругается так:
base operand of `->' has non-pointer type `_types_fd_set' .
В чем может быть проблема?
n - указатель на структуру, содержащуюю поле int sock.
Все, решил сам.
Последний раз редактировалось Glazz; 20.03.2009 в 16:34..
|
|
|

21.03.2009, 20:18
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
FD_ISSET((*n).sock,fds);
попробуй сделать так. хоть это и тоже самое но может прокатит.
а вообще n точно указатель?
и вообще скинь портотип функции FD_ISSET()  а лучше весь код
Последний раз редактировалось St0nX; 21.03.2009 в 20:24..
|
|
|

21.03.2009, 21:25
|
|
Участник форума
Регистрация: 09.08.2008
Сообщений: 139
Провел на форуме: 560332
Репутация:
15
|
|
Сообщение от St0nX
FD_ISSET((*n).sock,fds);
попробуй сделать так. хоть это и тоже самое но может прокатит.
а вообще n точно указатель?
и вообще скинь портотип функции FD_ISSET()  а лучше весь код
Читай. Я уже решил. Я в аргументах метода, где использую эту функцию указал fd_set &fds, а нужно было fd_set* fds. После этого все заработало.
|
|
|

21.03.2009, 22:01
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
 не заметил
|
|
|

22.03.2009, 22:08
|
|
Участник форума
Регистрация: 29.12.2004
Сообщений: 105
Провел на форуме: 89596
Репутация:
21
|
|
Доброго времени суток!
Однажды я спрашивал здесь по поводу "защиты от дураков" в С, мне ответили, что там её нет как таковой. Но лабораторные мне писАть надо, так что пока у нас вводятся только числа я попробовал, сделать вот такую проверку:
Код:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define MAXLINE 1000
double protect_double(char str[]){ // функция "защита от дураков"
int i; // переменная-счётчик
double digit; // возвращаемое значение
char str_2[MAXLINE]; // временная строка
for(i=0; i<strlen(str); i++){ // цикл проверки каждого введённого символа
if ((str[i]>='0'&&str[i]<='9')||(str[i]=='.')){ // определение принадлежности символа к числу или .
str_2[i]=str[i]; // если это число, то записываем в переменную строку
}
else { // если это не число, то выдаём сообщение об ошибке
printf("Вы ввели некорректные данные! Пожалуйста введите число."); // сообщение
break; // прерываем выполнение функции
}
}
if(i==strlen(str)){ // если все введённые символы - числа, то преобразуем строку в число
digit=atof(str_2); // преобразуем...
}
return digit; // возвращаем число
}
int main(void){
char s[MAXLINE]; // объявление вводимой строки
double a; // строка как число
printf("Введите пожалуйста число: \n"); // сообщение о вводе числа (на самом деле строки)
scanf("%s", &s); // сканируем вводимую строку
a=protect_double(s); // отправляем строку на проверку
printf("%f+1=%f\n", a, a+1); // выводим результат сложения, чтобы убедиться, что получили число
return 0; // завершение программы
}
всё бы ничего, но вот возникла проблема, которую я не знаю как решить:
функция protect_double должна возвращать занчение типа double, но какое значение она должна возвращать, если она завершилась, но не преобразовала строку (т.е. ввели не число)?
Как я понимаю, нужно в ней вместо break написать return <что-то>, что означало бы, что в строке не число, но ведь это <что-то> должно быть double. а как тогда в main отличить double, который с ошибкой от double, который ввели?
|
|
|

22.03.2009, 22:58
|
|
Участник форума
Регистрация: 19.05.2007
Сообщений: 281
Провел на форуме: 2823587
Репутация:
106
|
|
Как вариант. Если ничего не хочеш менять в своей программе то можно создать для таких целей структуру вот:
struct a
{
int val1;
int flag;
};
возвращай ее значения записывай в вал а то что ты определил записывай в флаг. Потом все проверяеш если флаг 1 то число если нет то гриш типо введите число.
или введи глобальную переменную.
|
|
|

23.03.2009, 20:44
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
вообще правильно делать по другому
bool protect_double(char* s, double& dbl_val);
вот так описываешь функцию. в ней проводишь преобразование. если в строке не дабл число, ты возвращаешь false. иначе true и в переменную dbl_val пишешь полученное число.
|
|
|

23.03.2009, 23:07
|
|
Участник форума
Регистрация: 02.12.2007
Сообщений: 132
Провел на форуме: 233095
Репутация:
21
|
|
Народ, объясните мне разницу в инклуде между <имя>,"имя" и 'имя'
В каких случаях какие скобки используются?
|
|
|

24.03.2009, 00:42
|
|
Участник форума
Регистрация: 26.02.2006
Сообщений: 209
Провел на форуме: 2418438
Репутация:
93
|
|
Сообщение от horlyk
Народ, объясните мне разницу в инклуде между <имя>,"имя" и 'имя'
В каких случаях какие скобки используются?
Код:
Директивы Препроцессора
Директивы препроцессора представляют собой инструкции, записанные в тексте программы на СИ, и выполняемые до трансляции программы. Директивы препроцессора позволяют изменить текст программы, например, заменить некоторые лексемы в тексте, вставить текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся.
Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:
#include "имя файла" #include <имя файла> Имя файла должно соответствовать соглашениям операционной системы и может состоять либо только из имени файла, либо из имени файла с предшествующим ему маршрутом. Если имя файла указано в кавычках, то поиск файла осуществляется в соответствии с заданным маршрутом, а при его отсутствии в текущем каталоге. Если имя файла задано в угловых скобках, то поиск файла производится в стандартных директориях операционной системы, задаваемых командой PATH.
Директива #include может быть вложенной, т.е. во включаемом файле тоже может содержаться директива #include, которая замещается после включения файла, содержащего эту директиву.
Директива #include широко используется для включения в программу так называемых заголовочных файлов, содержащих прототипы библиотечных функций, и поэтому большинство программ на СИ начинаются с этой директивы.
источник
|
|
|

24.03.2009, 12:22
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
мож не оч по теме, но всё же трабла с устоновкой визуал студио на ноуте.... вот на компе поставил всё ок, а но ноуте всё время такая хрень

помагайте плз
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|