标题说明了一切,有没有办法阻止一个方法继续并让它从一开始就重新开始?
#define _GLIBCXX_USE_CXX11_ABI 0
#include "../mynet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace cv;
int main(int argc, char *argv[])
{
int sockfd = 0,n = 0;
unsigned char recvBuff[120*160*3];
struct sockaddr_in serv_addr;
sockInit();
memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
printf("Connected to server...\n");
Mat frame(120, 160, CV_8UC3);
int csz = 0;
cvNamedWindow("Display", CV_WINDOW_AUTOSIZE);
printf("OK here 0\n");
for(;;)
{
csz = 0;
while((n = recv(sockfd, (char*)recvBuff, sizeof(recvBuff), 0)) > 0)
{
printf("OK here 2\n");
printf("Read %d bytes...\n", n);
csz += n;
if(csz<=120*160*3)
{
memcpy(frame.data+(csz-n), recvBuff, n);
}
if(csz>= 120*160*3) break;
}
printf("OK here 3\n");
printf("Got data of size %d bytes...\n", csz);
imshow("Display", frame);
if(csz < 120*160*3)
{
printf("\n Read Error \n");
}
if(waitKey(30)=='q') break;
// std::swap(prevgray, gray);
}
sockClose(sockfd);
sockQuit();
return 0;
}
答案 0 :(得分:1)
您可以通过返回int grom方法立即从该点返回,例如-1如果不正确并且您知道需要重试,或者如果正确则返回0。在调用代码中,您可以在循环中调用此方法,直到返回代码== 0。
答案 1 :(得分:1)
我会做这样的事情:
读取方法中的数字,无需将它们作为参数传递。在循环中读取它们,直到两个数字都正确输入然后中断。如果输入错误,则打印信息并再次阅读。对于任何错误的输入,Scanner.nextInt()将抛出InputMismatchException
异常,在那里我们也将使用该输入中的新行字符。
public static int insertNumbers() {
int num1;
int num2;
while(true) { // loop until correct input.
System.out.println("Insert two numbers");
try {
num1 = numberScanner.nextInt();
num2 = numberScanner.nextInt();
break; // break once correct input is recorded.
} catch (InputMismatchException e) {
System.out.println("Equation format incorrect"); // print message and repeat again for input.
numberScanner.nextLine();
}
}
answer = num1 + num2;
return answer; // return the results.
}
答案 2 :(得分:1)
作为返回退出代码或使用循环的替代方法(我认为这可以更明显,因为您可以使用continue
),您可以再次调用该函数并阻止原始实例进一步:
public int foo(){
//do stuff
if (must_restart){
return foo();
//or, if the function "returns" void: (note that 2 returns/having statements after a return is pointless, this is just an example)
foo();
return;
}
}
答案 3 :(得分:1)
这就是我的建议:
在else的情况下,你只需使用这个结构
else{
System.out.println("Equation format incorrect");
return insertNumbers();
}
请注意,在输入为两个数字之前,代码将继续询问输入。不需要方法声明中的参数,因为你不能使用它们