Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
1

setlocate и char xx[30]; - Не компилирует

08.08.2011, 02:14. Показов 5765. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеем код C:
C
1
2
3
4
5
6
7
8
9
#include <locale.h>;
#include <stdio.h>;
int main()
{
    setlocale(LC_ALL,"Russian");
    printf("Тест C\n");
    getchar();
    return 0;
}
Отлично компилируется, нет проблем. Русский работает в консоли.

Но стоит добавить допусти char name[40]; вот так:
C
1
2
3
4
5
6
7
8
9
10
#include <locale.h>;
#include <stdio.h>;
int main()
{
    setlocale(LC_ALL,"Russian");
    char name[40];
    printf("Тест C\n");
    getchar();
    return 0;
}
как компилятор(Visual Studio C++ 2010 express) отказывается работать:
1>------ Построение начато: проект: test, Конфигурация: Debug Win32 ------
1> test.c
1>c:\users\mult\documents\visual studio 2010\projects\test.c\test\test.c(33): warning C4067: непредвиденные лексемы за директивой препроцессора, требуется newline
1>c:\users\mult\documents\visual studio 2010\projects\test.c\test\test.c(34): warning C4067: непредвиденные лексемы за директивой препроцессора, требуется newline
1>c:\users\mult\documents\visual studio 2010\projects\test.c\test\test.c(38): error C2143: синтаксическая ошибка: отсутствие ";" перед "тип"
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Если закомментировать setlocate - работает. Так же и наоборот. Вместе - не хотят.

Подскажите знающие люди, в чем могут быть грабли. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2011, 02:14
Ответы с готовыми решениями:

Error: 'setlocate' was not declared in this scope
Нужно написать программу на СИ, я новичок, выдает мне ошибки, что здесь не верно? #include...

Code::Blocks в определенном проекте не компилирует "tr1/shared_ptr.h", при этом в другом проекте компилирует!
Здравствуйте, хотел бы попросить у вас помощи. Пытаюсь написать простой платформер на C++, и в...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

char* to char или (char* запись в файл)
Привет всем! Вопрос: Как можно перевести char* в char или записать даные в файл с char*? ...

18
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2011, 02:31 2
Проверил на 2х компиляторах (базирующихся на gcc), проблем не было
0
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
08.08.2011, 02:31 3
msvc 2010 все скомпилировалось, оО
попробуйте сделать rebuild проекта.
0
Заблокирован
08.08.2011, 02:45 4
C++
1
#include <locale.h>;
Это теперь модно - после инклюда точка с запятой?
1
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
08.08.2011, 04:17 5
Цитата Сообщение от KuraevE Посмотреть сообщение
Если закомментировать setlocate - работает. Так же и наоборот. Вместе - не хотят.
Ну а что тут странного? В C89 переменные можно объявлять только в начале блока. Поменяйте местами char name[40] и setlocale().
Ну и про точки с запятой после инклюдов уже сказали, хотя это всего лишь предупреждения.
1
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 13:42  [ТС] 6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну а что тут странного? В C89 переменные можно объявлять только в начале блока. Поменяйте местами char name[40] и setlocale().
Ну и про точки с запятой после инклюдов уже сказали, хотя это всего лишь предупреждения.
Действительно, если поменять местами выдает
1>c:\users\mult\documents\visual studio 2010\projects\test.c\test\test.c(37): warning C4101: name: неиспользованная локальная переменная
и это понятно, но работает.

А можно по подробнее про С89? это я так понимаю стандарт? Я просто пишу по книги, и так большинство примеров пишут с учетом С99...

P.S. Спасибо большое за ответы!
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
08.08.2011, 14:27 7
Цитата Сообщение от KuraevE Посмотреть сообщение
А можно по подробнее про С89? это я так понимаю стандарт?
Да, предшественник C99 (есть ещё C90, но про него пишут, что отличий от С89 нет)

Цитата Сообщение от KuraevE Посмотреть сообщение
Я просто пишу по книги, и так большинство примеров пишут с учетом С99...
Да, в C99 переменные можно объявлять не только в начале. Можно взять компилятор с поддержкой C99 (или может быть нужно просто включить эту поддержку, например для GCC ключ -std=c99)

Добавлено через 1 минуту
Поддерживает ли 2010-я студия C99, и если да, то как включить — не знаю.
1
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 14:30  [ТС] 8
У меня есть на второй машине Visual studio 2010 professional - и xCode в хакинтоше, они насколько я знаю поддерживают С99?
Хотя я честно говоря, думал что 2010 express тоже поддерживает.. Надо в настройках покопаться.

Спасибо большое за ответы.
0
1 / 1 / 0
Регистрация: 03.06.2010
Сообщений: 61
08.08.2011, 17:46 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <clocale>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    char name[40];
    cout << "Тест C" << endl;
    getch();
    return 0;
}
Работает без проблем на QT и Visual 2010. Только вот зачем тебе вообще там name?
P.S. Твой вариант тоже компилировался удачно)
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
08.08.2011, 18:24 10
alemor, у тебя программа не на C, а на C++. Ничего удивительного, что она работает без проблем
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 19:05  [ТС] 11
Цитата Сообщение от alemor Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <clocale>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    char name[40];
    cout << "Тест C" << endl;
    getch();
    return 0;
}
Работает без проблем на QT и Visual 2010. Только вот зачем тебе вообще там name?
P.S. Твой вариант тоже компилировался удачно)
У вас С++) как уже сказали выше... Да и причину выяснили. Стандарт С89 а в С99 все работает.
Ну а "зачем", это просто кусок кода) который показывал суть проблемы. Весь код кидать нет смысла, много и не по делу было бы

Всем спасибо за ответы и участие
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
08.08.2011, 19:33 12
KuraevE, ANSI C99 кроме gcc компиляторов, никакие другие по-моему и не поддерживают. Но, если пользуетесь gcc (MinGW в винде), в самом стандарте С99 можно найти много полезного. У шилдта в "Полный справочник по С" есть неплохое описание нововведений этого стандарта, правда, не полное, и как применять, особо не написано, но общее представление даёт. Во всяком случае, когда будете в других книгах встречать, будете уже представлять, что к чему...
1
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 19:47  [ТС] 13
Цитата Сообщение от easybudda Посмотреть сообщение
KuraevE, ANSI C99 кроме gcc компиляторов, никакие другие по-моему и не поддерживают. Но, если пользуетесь gcc (MinGW в винде), в самом стандарте С99 можно найти много полезного. У шилдта в "Полный справочник по С" есть неплохое описание нововведений этого стандарта, правда, не полное, и как применять, особо не написано, но общее представление даёт. Во всяком случае, когда будете в других книгах встречать, будете уже представлять, что к чему...
спасибо) Я пока читаю и изучаю "Язык программирования С. Лекции и Упражнения" 5е издание. Стивен Прат доступно очень. За неделю из не имеющего понятия об языке С, более менее понимающим себя чувствую.
0
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
09.08.2011, 13:53 14
Попробуйте использовать подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <locale>
using namespace std;
int main()
{  
// установка русской локали для строкового потока и для вывода
    wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));
 
    wchar_t mass[100]; 
    wcin.getline(mass,99);
 
    wcout << L"Вы ввели такую строку: "<< mass << endl;
 
   return 0;
}
может не будет ругаться...
0
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
09.08.2011, 16:45 15
Цитата Сообщение от Visary_Master Посмотреть сообщение
Попробуйте использовать подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <locale>
using namespace std;
int main()
{  
// установка русской локали для строкового потока и для вывода
    wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));
 
    wchar_t mass[100]; 
    wcin.getline(mass,99);
 
    wcout << L"Вы ввели такую строку: "<< mass << endl;
 
   return 0;
}
может не будет ругаться...
мб хватит флудить?
при стандарте С89 с вашим кодом будет таже проблема.
0
Эксперт С++
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
09.08.2011, 16:49 16
Цитата Сообщение от silentnuke Посмотреть сообщение
при стандарте С89 с вашим кодом будет таже проблема.
Там ещё и другая проблема будет. В C89 нет <iostream> и wcout

Не по теме:

Цитата Сообщение от silentnuke Посмотреть сообщение
мб хватит флудить?
Всё. Ухожу-ухожу.

0
Заблокирован
09.08.2011, 17:03 17
Цитата Сообщение от grizlik78 Посмотреть сообщение
Там ещё и другая проблема будет. В C89 нет <iostream> и wcout

Не по теме:


Всё. Ухожу-ухожу.

А самое главное - в С такое определение функции main неверное!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
09.08.2011, 17:19 18
Цитата Сообщение от Сыроежка Посмотреть сообщение
А самое главное - в С такое определение функции main неверное!
В превых главах КиР вообще было
C
1
2
3
4
#include <stdio.h>
main(){
    printf("Hello, world!\n");
}
А они знали, про что писали... Вот с iostream действительно не задалось.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 17:36 19
Цитата Сообщение от Сыроежка Посмотреть сообщение
А самое главное - в С такое определение функции main неверное!
Вы про int что ли?
Так если не указывать тип main'a, то просто будет по умолчанию int.
http://ru.wikipedia.org/wiki/%... %D0%B9_int
0
09.08.2011, 17:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2011, 17:36
Помогаю со студенческими работами здесь

Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *"
делал задание, но на строке 36 строке пишет, что &quot;char *concat(char *,...)&quot;: невозможно...

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char tracks = { &quot;ya ostavil svoe serdce v harvardskom...

Assigning from int to char[10] from char to char[10]
добрый день, подскажите пожалуйста, в карточной колоде 52 карты, у меня есть массив структур где ...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru