Вы забыли инициализировать buffer
. И вам лучше завершить свою строку управления форматом printf (3) с помощью \n
или иначе вызвать fflush (3) перед любым вводом (начиная с stdio (3) [ 117] буферизируется).
Неинициализированный указатель содержит мусор. Его использование - неопределенное поведение . Будьте напуганы !
Так что я предлагаю кодировать
size_t bufsiz = 64;
char *buffer = malloc(bufsiz);
if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); };
и позже
printf("Salut ! Quel est ton nom ?\n");
characters = getline(&buffer,&bufsize,stdin);
В следующий раз включите все предупреждения и информацию отладки, когда компилируя, поэтому скомпилируйте ваш код с помощью gcc -Wall -Wextra -g
, если используете GCC . Вы бы получили несколько предупреждений.
Конечно, прочитайте Как отлаживать небольшие программы и отладка с помощью GDB
В Linux, в В вашем конкретном случае вас может заинтересовать использование readline (3) вместо getline (3) .
Не забудьте прочитать документацию по каждой функции, которую вы используете (например, здесь , если она стандартная C).
Это поможет:
CGContextSetBlendMode(context, kCGBlendModeClear)
Я попытался использовать:
CGContextSetStrokeColorWithColor (myContext, [[UIColor clearColor] CGColor]);
но это не работает, потому что это, кажется, "тянет" сверху контекста с невидимым цветом (и невидимый цвет + безотносительно цвета, который это привлекает = цвет, который это привлекает).
Единственное решение, которое я нашел (который не оптимален):
CGContextClearRect (myContext, CGRectMake(x, y, width, height));
К сожалению, это означает, что необходимо проследить серию, реагирует, и генерируйте строку сами...
Я закончил тем, что использовал алгоритм строки Bresenham (слушающий назад дни былого, когда я должен был записать свои собственные графические стандартные программы)...
- (void) contextEraseLine:(CGContextRef) ctx from:(CGPoint)startPoint to:(CGPoint) endPoint withThickness:(int)thickness {
int x, cx, deltax, xstep,
y, cy, deltay, ystep,
error, st, dupe;
int x0, y0, x1, y1;
x0 = startPoint.x;
y0 = startPoint.y;
x1 = endPoint.x;
y1 = endPoint.y;
// find largest delta for pixel steps
st = (abs(y1 - y0) > abs(x1 - x0));
// if deltay > deltax then swap x,y
if (st) {
(x0 ^= y0); (y0 ^= x0); (x0 ^= y0); // swap(x0, y0);
(x1 ^= y1); (y1 ^= x1); (x1 ^= y1); // swap(x1, y1);
}
deltax = abs(x1 - x0);
deltay = abs(y1 - y0);
error = (deltax / 2);
y = y0;
if (x0 > x1) { xstep = -1; }
else { xstep = 1; }
if (y0 > y1) { ystep = -1; }
else { ystep = 1; }
for ((x = x0); (x != (x1 + xstep)); (x += xstep))
{
(cx = x); (cy = y); // copy of x, copy of y
// if x,y swapped above, swap them back now
if (st) { (cx ^= cy); (cy ^= cx); (cx ^= cy); }
(dupe = 0); // initialize no dupe
if(!dupe) { // if not a dupe, write it out
//NSLog(@"(%2d, %2d)", cx, cy);
CGContextClearRect(ctx, CGRectMake(cx, cy, thickness, thickness));
}
(error -= deltay); // converge toward end of line
if (error < 0) { // not done yet
(y += ystep);
(error += deltax);
}
}
}
Уф! Это - длинный путь для движения для создания (несколько) неуклюжей строки средства стирания.
Для использования его сделайте что-то как:
- (void)eraseStart {
// erase lines
UIGraphicsBeginImageContext(drawingBoard.size);
ctx = UIGraphicsGetCurrentContext();
CGContextDrawImage(ctx,CGRectMake(0,0,drawingBoard.size.width, drawingBoard.size.height),[drawingBoard CGImage]);
}
- (void)eraseEnd {
drawingBoard = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[drawingView removeFromSuperview];
[drawingView release];
drawingView = [[UIImageView alloc] initWithImage:drawingBoard];
drawingView.frame = CGRectMake(intEtchX, intEtchY, intEtchWidth, intEtchHeight);
[self.view addSubview:drawingView];
}
Это предполагает, что Вы уже создали drawingView (UIImageView) и чертежную доску (UIImage).
Затем для стирания строки просто сделайте что-то как:
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self eraseStart];
[self contextEraseLine:ctx from:CGPointMake (x1, y1) to:CGPointMake (x2, y2) withThickness:10];
[self eraseEnd];
(замените x1, y1, x2, и y2 с соответствующими значениями)...