Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.209.237] |
|
Сообщ.
#1
,
|
|
|
Изучаю C++ при помощи visual studio 2010
разбираю один пример и никак не пойму в чём дело то? сыплются ошибки такого рода: error C2143: syntax error : missing ')' before '{' error C3861: 'min': identifier not found error C2143: syntax error : missing ')' before '{' error C2143: syntax error : missing ';' before ')' error C3861: 'min': identifier not found error C2143: syntax error : missing ')' before '{' error C2143: syntax error : missing ';' before ')' error C3861: 'min': identifier not found Путём упорного гугления кажется понял что не хватает какого то include. Какой надо подключить, подскажите пожалуйста? у меня подключены #include "iostream" #include "algorithm" #include <conio.h> ещё пробовал подключить #include "stdlib.h" #include "time.h" #include "math.h" Всё без толку. ОС windows7 x64 |
Сообщ.
#2
,
|
|
|
А код примера можно посмотреть?
|
Сообщ.
#3
,
|
|
|
Однако, информация на буржуйском сайте помогла разобраться с min (error C3861)
я добавил #include <stdio.h> и переправил min в __min Но ошибка error C2143: syntax error : missing ')' before '{' пока не решена. Други, ну помогите кто нибудь, уже часа полтора лбом в закрытую дверь долблю. Лоб всмятку, на двери пара лёгких царапин(( Добавлено Код - не вопрос. Уверен, с синтаксисом там всё норм. void merge(int *A, int *B, int l, int m, int r) //A - сортируемый массив, B - буфер для слияния, l - первый элемент первой части, r - последний элемент второй части, m - последний элемент первой части { int i=l; int j = m+1; int k=l; //Вставлять минимальные элементы в B пока не кончится одна из последовательностей while (( i<=m) && (j<= r)) { if (A[i] { // РУГАЕТСЯ ВОТ ЗДЕСЬ B[k] = A[i]; i++; } else { B[k] = A[j]; j++; } k++; } //Скопировать остаток, если таковой имеется while (i <= m) { B[k]=A[i]; k++; i++; } while (j <= r) { B[k]=A[j]; k++; j++; } //Отсортированная часть остаётся в B } |
Сообщ.
#4
,
|
|
|
Цитата Flass @ Изучаю C++ при помощи visual studio 2010 разбираю один пример и никак не пойму в чём дело то? сыплются ошибки такого рода: error C3861: 'min': identifier not found error C3861: 'min': identifier not found Путём упорного гугления кажется понял что не хватает какого то include. Какой надо подключить, подскажите пожалуйста? у меня подключены #include "iostream" #include "algorithm" #include <conio.h> ещё пробовал подключить #include "stdlib.h" #include "time.h" #include "math.h" Всё без толку. Все без толку, потому что вы не понимаете, что вы делаете. То есть вы используете имя min, а что это за имя, где ооно объявлено, и к чему оно относится, = вы не знаете. Более того эти два набора заголовков не совместимы между собой, так как первый набор заголовков относится к С++, а второй набор заголовков - к С. Поэтому вам сначала надо разобраться, на каком языке вы пишите программу: на С++ или С. Если вы пишите на С++, то стандартный алгоритм std::min объявлен в заголовочном файле <algorithm>, и если вы не включили стандартное пространство имен в глобальное пространство имен, то вам перед именем min надо указывать имя того пространства имен, где этот алгоритм объявлен, то есть вам, скорей всего, следовало писать std::min Добавлено Цитата Flass @ if (A[i] { // РУГАЕТСЯ ВОТ ЗДЕСЬ А синтаксическая ошибка у вас, к примеру, в указанном выше предложении. Вы забыли в if поставить закрывающуюся круглую скобку после выражения, состоящего из элемента массива. |
Сообщ.
#5
,
|
|
|
Как я понял, min это функция в стандартной библиотеке, которую мы подключаем через include. Всё таки с min мне удалось разобраться. Поясните пожалуйста тогда, с учётом того что Visual Studio это всё таки C++, как должны выглядеть мои include?
Сейчас они выглядят так: #include "iostream" #include "algorithm" #include <conio.h> #include <stdio.h> Добавлено Цитата Сыроежка @ А синтаксическая ошибка у вас, к примеру, в указанном выше предложении. Вы забыли в if поставить закрывающуюся круглую скобку после выражения, состоящего из элемента массива. Миль пардон, но это текст примера и у автора всё работало... Такой синтаксис вполне законен, я думаю) Добавлено Кстати, я сделал как вы мне посоветовали стандартный алгоритм std::min объявлен в заголовочном файле <algorithm>, и если вы не включили стандартное пространство имен в глобальное пространство имен, то вам перед именем min надо указывать имя того пространства имен, где этот алгоритм объявлен, то есть вам, скорей всего, следовало писать std::min Сработало, спасибо! А вот по второй ошибке пока никак.. |
Сообщ.
#6
,
|
|
|
Цитата Flass @ Миль пардон, но это текст примера и у автора всё работало... Такой синтаксис вполне законен, я думаю) Если вы считаете, что такой код вполне законен, то все свои претензии предъявляйте к разработчику компилятора! Я вам ничем помочь не могу. |
Сообщ.
#7
,
|
|
|
Что делать, я не копенгаген в C++, знаю только самые основы. Всё таки, с одной ошибкой мы разобрались, подскажите как решить вторую. Это пример работавшего у автора кода, дело в том что я не знаю какие он использовал include потому что приведён просто кусок кода и всё. Ёлки - палки, да как вообще такая ошибка может быть?)
|
Сообщ.
#8
,
|
|
|
Попробуйте
if (A[i] { // РУГАЕТСЯ ВОТ ЗДЕСЬ Заменить на if (A[i]) { |
Сообщ.
#9
,
|
|
|
Цитата Flass @ Цитата aster_x @ Нет, я думаю дело не в этом. Если поступить как вы советуете, дальше при аналогичных ошибках и исправлении начинаются и вовсе странные вещи, например: //Сортировка слиянием, распараллеленная void mp_sort(int* A, int* B, int N, int P) //A - сортируемый массив, B - буфер для слияния, N - размер массива, P - число параллельно выполняемых потоков { int *tA = A; int *tB = B; int *t = NULL; //1)Разбиение на блоки и сортировка их по отдельности int i; int part_size = (int)ceil((float)N/(float)P); #pragma omp parallel shared(P, tA, tB, N, part_size) #pragma omp for private(i) for(i=0;i {// ВОТ ЗДЕСЬ nrmsort(tA,tB,i*part_size,std::min((i+1)*part_size,N-1)); } int r2,m; while (part_size < (2*N))// а ещё почему то вайл подчёркнут красным, хотя в список ошибок не внесён. { #pragma omp parallel shared(P, tA, tB, N, part_size) #pragma omp for private(i,r2,m) for(i=0;i { r2 = std::min(i+part_size-1,N-1); m = ((i+i+part_size-1) >> 1); merge(tA,tB,i,m,r2); } part_size *= 2; t = tA; tA = tB; tB = t; t = NULL; } if (tA != A) { |
Сообщ.
#10
,
|
|
|
я на знаю где вы такой код нашли. Но он вообще не сответсвует не одному стандарту.
Что это такое? Цитата for(i=0;i Должно быть так, как минимум for(i=0;;) Добавлено дайте ссылку где вы этот "код" откопали. |
Сообщ.
#11
,
|
|
|
То есть эти выражения полностью эквивалентны?
|
Сообщ.
#12
,
|
|
|
Скорее всего этот "код" прошел какую то фильтрацию(наподобие обрезание HTML тегов), после чего пришел в "не употребительное" состояние.
|
Сообщ.
#13
,
|
|
|
http://www.hpcc.unn.ru/?dir=273 вот ссылка
|
Сообщ.
#14
,
|
|
|
Цитата Flass @ То есть эти выражения полностью эквивалентны? Такого "for(i=0;i" выражения вообще нет в С++, это нарушение синтаксиса написания программы. Добавлено Код на указанном вами сайте. Код явно "кастрирован". Где то его "посекло". Вы вы и будете ломать голову. Поищите другие примеры реализации Вашей задачи. Добавлено Цитата aster_x @ for(i=0;i Попробуйте заменить на for(i=0;i<N;++i) |
Сообщ.
#15
,
|
|
|
Вот оно что!! Спасибо за подсказку, а то у меня уже мозги кипят)
Добавлено Всем спасибо, разобрались в чём тут дело) Тема закрыта. Код. кстати, не заработал( Добавлено Вопрос решён |