我可以在 C++ 中通过引用传递多少个参数,而不会出现异常行为
我遇到了一个函数问题:
int parsearRestricciones(char linea[], unsigned int& x, unsigned int& y, unsigned int& tiempo, char restric[])
在该函数内我解析 linea[]。
输入包括:三个无符号整数和一串标点字符。我需要这样阅读它们。 当我将 atoi(linea+offset) 分配给变量 tiempo 时,就会出现问题。在函数外部(即在 main() 中),tiempo 的值与内部的值不同。 我只遇到了 tiempo 的问题(我用指向结构的指针替换了 x,y 和 tiempo。它有效)
可能是什么问题?
感谢您的帮助。
-----再次编辑
完整代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
#include <cassert>
#define MAX_RESTRIC 3 // Tres sentidos. Si hay 4, se usa '+'
#define MAX_LINEA 80
#define entrada cin
using namespace std;
int parsearRestricciones(char *linea, unsigned int& x, unsigned int& y, unsigned int& t, char *restric) {
// ! solo funciona si x,y,t,restric estan en una misma linea (i.e. no hay CR LF)
int i=0, j=0;
//Parsea x de la casilla
x = atol(linea+i);//strtol(linea,(char**)NULL,10);
while (isdigit(linea[i])) i++;
while (isspace(linea[i])) i++;
//Parsea y de la casilla
y = atol(linea+i);
while (isdigit(linea[i])) i++;
while (isspace(linea[i])) i++;
if(linea[i] == '\0')
return -1;
//Parsea tiempo
t = atol(linea+i);
cout << "---" << t << endl;
while (!ispunct(linea[i])) i++;
//Parsea restricciones
while (linea[i] != '\0' && linea[i] != ' '){
restric[j] = linea[i];
i++; j++;
}
restric[j]='\0';
return 1;
}
int main (int argc, char** argv)
{
// Sugerencia de argumentos
// --d (por Dijkstra)
// --axe (por A*, distancia euclideana)
// --axm (por A*, distancia manhattan)
// y dos màs que veremos luego :)
unsigned int X, Y;
unsigned int xi, yi;
unsigned int xf, yf;
unsigned int x,y,tiempo;
char restricciones[MAX_RESTRIC + 1];
//Buffer para parsear las lineas con restricciones
char linea[MAX_LINEA + 1];
bool finCasos = false;
bool siguienteCaso = false;
while (!finCasos)
{
if (siguienteCaso){
// Se leyó otro mapa antes que éste (hubo parseo, y quedo en xcasilla,ycasilla)
X = x;
Y = y;
siguienteCaso = false;
} else {
// Sino, lee por primera vez las dimensiones del mapa
entrada >> X >> Y;
}
if ( X == 0 && Y == 0 )
finCasos = true;
else {
entrada >> xi >> yi;
entrada >> xf >> yf;
// Lee restricciones hasta que encuentra una linea sin ellas (sin tiempo ni direccion)
// se asumira, que corresponde a las dimensiones del siguiente caso, y los usará en la siguiente
// iteracion
while(!siguienteCaso) {
cin.get(); //lee un '\0' que quedó (?)
cin.getline(linea, MAX_LINEA+1);
if ( parsearRestricciones(linea,x,y,tiempo, restricciones) == -1 ) {
siguienteCaso = true;
} else {
cout << "X = " << x << endl;
cout << "Y = " << y << endl;
cout << "tiempo = " << tiempo << endl;
cout << "restric = " << restricciones << endl;
int j=0;
cout << "restric = " ;
while(restricciones[j]!='\0'){
cout << restricciones[j];j++;}
cout << endl;
//-- agregar datos al grafo/mapa
}
}
// Resolver usando algun algoritmo
//--- resolver(MAPA)
}
}
return 0;
}
CFLAGS。 -墙-管道-g -ggdb -DONLINE_JUDGE -DNDEBUG (Makefile 还为 uvaonlinejudge 构建了另一个源)
输入:
101
10
1
1
2
2
1000 10000 100000 +++++
输出:
---100000
X = 1000
Y = 10000
tiempo = 65579
restric = +++++
restric = +++++
^X^C (I did break)
我刚刚在 Windows 中测试了该程序(使用 Code::Blocks,默认设置)并且它有效:/
顺便说一句,我在 Virtualbox 中使用 Ubuntu
你可以吗告诉我我做错了什么?
I had a problem with a function:
int parsearRestricciones(char linea[], unsigned int& x, unsigned int& y, unsigned int& tiempo, char restric[])
Inside that function I parse linea[].
The input consists in: three unsigned integers, and a string of punctuation characters. I need to read them that way.
The problem ocurrs when I assign atoi(linea+offset) to variable tiempo. Outside the function (i.e., in main() ), the value of tiempo is not the same that it's inside.
I had the problem only with tiempo (I replaced x,y and tiempo by a pointer to struct. It works)
What could be the problem?
Thanks for your help.
-----edit-again
The full code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
#include <cassert>
#define MAX_RESTRIC 3 // Tres sentidos. Si hay 4, se usa '+'
#define MAX_LINEA 80
#define entrada cin
using namespace std;
int parsearRestricciones(char *linea, unsigned int& x, unsigned int& y, unsigned int& t, char *restric) {
// ! solo funciona si x,y,t,restric estan en una misma linea (i.e. no hay CR LF)
int i=0, j=0;
//Parsea x de la casilla
x = atol(linea+i);//strtol(linea,(char**)NULL,10);
while (isdigit(linea[i])) i++;
while (isspace(linea[i])) i++;
//Parsea y de la casilla
y = atol(linea+i);
while (isdigit(linea[i])) i++;
while (isspace(linea[i])) i++;
if(linea[i] == '\0')
return -1;
//Parsea tiempo
t = atol(linea+i);
cout << "---" << t << endl;
while (!ispunct(linea[i])) i++;
//Parsea restricciones
while (linea[i] != '\0' && linea[i] != ' '){
restric[j] = linea[i];
i++; j++;
}
restric[j]='\0';
return 1;
}
int main (int argc, char** argv)
{
// Sugerencia de argumentos
// --d (por Dijkstra)
// --axe (por A*, distancia euclideana)
// --axm (por A*, distancia manhattan)
// y dos màs que veremos luego :)
unsigned int X, Y;
unsigned int xi, yi;
unsigned int xf, yf;
unsigned int x,y,tiempo;
char restricciones[MAX_RESTRIC + 1];
//Buffer para parsear las lineas con restricciones
char linea[MAX_LINEA + 1];
bool finCasos = false;
bool siguienteCaso = false;
while (!finCasos)
{
if (siguienteCaso){
// Se leyó otro mapa antes que éste (hubo parseo, y quedo en xcasilla,ycasilla)
X = x;
Y = y;
siguienteCaso = false;
} else {
// Sino, lee por primera vez las dimensiones del mapa
entrada >> X >> Y;
}
if ( X == 0 && Y == 0 )
finCasos = true;
else {
entrada >> xi >> yi;
entrada >> xf >> yf;
// Lee restricciones hasta que encuentra una linea sin ellas (sin tiempo ni direccion)
// se asumira, que corresponde a las dimensiones del siguiente caso, y los usará en la siguiente
// iteracion
while(!siguienteCaso) {
cin.get(); //lee un '\0' que quedó (?)
cin.getline(linea, MAX_LINEA+1);
if ( parsearRestricciones(linea,x,y,tiempo, restricciones) == -1 ) {
siguienteCaso = true;
} else {
cout << "X = " << x << endl;
cout << "Y = " << y << endl;
cout << "tiempo = " << tiempo << endl;
cout << "restric = " << restricciones << endl;
int j=0;
cout << "restric = " ;
while(restricciones[j]!='\0'){
cout << restricciones[j];j++;}
cout << endl;
//-- agregar datos al grafo/mapa
}
}
// Resolver usando algun algoritmo
//--- resolver(MAPA)
}
}
return 0;
}
CFLAGS. -Wall -pipe -g -ggdb -DONLINE_JUDGE -DNDEBUG
(The Makefile also builds another source, for uvaonlinejudge)
Input:
101
10
1
1
2
2
1000 10000 100000 +++++
Output:
---100000
X = 1000
Y = 10000
tiempo = 65579
restric = +++++
restric = +++++
^X^C (I did break)
I just tested the program in Windows (using Code::Blocks, default settings) and it worked :/
By the way, I'm using Ubuntu in Virtualbox
Could you tell me what I'm doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我可以在 C++ 中通过引用传递多少个参数,而不会出现异常行为?
你想要多少就多少!
How many parameters can I pass by reference in C++, without getting abnormal behavior?
As many as you want to!
没有这样的限制。但是,您的函数不以任何方式使用 tiempo,而是使用一些名为 t 的变量:
t = atol(linea+i);
There is no such limit. However, your function does not use tiempo in any way, it uses some variable called t instead:
t = atol(linea+i);