Вопрос по С++

dreamer

Member
вопрос вопшемно по C++ Builder: как можно сделать чтото типа такого -
если веб камеру использует другая программа то нужно чтобы копия изображения записывалась и мне, если камеру не что не использует то ломиться на прямую к ней, но если другая программа начнет ее тоже допытываться то перейти в первый режим - пасивный, как это можно сделать и можно ли воопше?
Очень уж узкий вопрос, лучше бы ты создал отдельную тему, а про работу с камерами через WinAPI ты читал?
 

Cris

Member
Очень уж узкий вопрос, лучше бы ты создал отдельную тему, а про работу с камерами через WinAPI ты читал?
вроде как почитывал, но если хто на словах раскажет будет понятней)
ну вроде нашол хороший сайт который понятно на русском описует directshow, но меня больше волнует другйо вопрос - смогу ли я подсоедениться какими либо методами к вебкамере которая уже работает с другим приложением?
 
Останнє редагування:
Собственно вопросик по передаче массива в функцию.

#include <stdio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int z[], int n, int m, char q);

void main(void)
{
int a[Ax][Ay], min, numi, numj;
vvod(a, Ax, Ay, 'a');
vvod(b, Bx, By, 'b');


На строку vvod(a, Ax, Ay, 'a'); и vvod(b, Bx, By, 'b');
идет ругательство:
Cannot convert 'int [7] _ss' to 'int *'
Type mismatch in parameter 'z' in call to 'vvod(int *, int, int, char)'
Cannot convert 'int [4] _ss' to 'int *'
Type mismatch in parameter 'z' in call to 'vvod(int *, int, int, char)'


Если бы хотя бы Ay и By были равны, то можно было бы записать:
void vvod(int z[][X], int n, int m, char q);

Но как быть если же количество столбцов двумерного массива разные?
 

xxxFAFNIRxxx

Вечный студент :)
ну описан двохмерный массив, а в прототипе функции одномерный.

ЗЫ. а хотелось бы услышать задание и код программы полностью, возможно это можно сделать и без дополнительной функции для ввода.
 

quant

yeah
как-то так
Код:
#include <stdio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int *z, int n, int m, char q) {
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf("%c[%d][%d] = ", q, i, j);
			scanf("%d", z + i * m + j);
		}
	}
	putchar('\n');
}

void print(int* z, int n, int m, char q) {
	printf("\n%c:\n", q);
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf ("%d ", z[i * m + j]);
		}
		putchar('\n');
	}
}

void main() {
	int a[Ax][Ay], b[Bx][By], min, numi, numj;
	vvod(&a[0][0], Ax, Ay, 'a');
	vvod(&b[0][0], Bx, By, 'b');
	print(&a[0][0], Ax, Ay, 'a');
	print(&b[0][0], Bx, By, 'b');
}
 
ну описан двохмерный массив, а в прототипе функции одномерный.

ЗЫ. а хотелось бы услышать задание и код программы полностью, возможно это можно сделать и без дополнительной функции для ввода.
Можно, но есть еще функция для вычисления, которая выдает такие же ошибки, я ее приводить не стал.

А в примере нужно найти минимальный элемент в матрица а (2,7) и б(1,4) и найти его номер строки и столбца.

Я реализовывал ее примерно вот так:

#include <stdio.h>
#include <conio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int z[], int n, int m, char q);
void fn(int z[], int n, int m, int *min, int *numi, int *numj);

void main(void)
{
int a[Ax][Ay], b[Bx][By], min, numi, numj;
vvod(a, Ax, Ay, 'a');
vvod(b, Bx, By, 'b');

fn(a, Ax, Ay, &min, &numi, &numj);
printf("Min element masiva a=%d ego stroka=%d stolbec=%d\n",min,numi,numj);
fn(b, Bx, By, &min, &numi, &numj);
printf("Min element masiva b=%d ego stroka=%d stolbec=%d\n",min,numi,numj);
}

void vvod(int z[], int n, int m, char q)
{
int i, j;

for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
printf("Vvedite %c[%d][%d] \n",q,i,j);
scanf("%d",&z[j]);
}
}
}


void fn(int z[], int n, int m, int *min, int *numi, int *numj)
{
int i,j;
*min=z[0][0];
*numi=0;
*numj=0;

for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
if (z[j]<*min)
{
*min=z[j];
*numi=i;
*numj=j;
}
}
}
}
 
Останнє редагування:
как-то так
Код:
#include <stdio.h>
#define Ax 2
#define Ay 7
#define Bx 1
#define By 4

void vvod(int *z, int n, int m, char q) {
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf("%c[%d][%d] = ", q, i, j);
			scanf("%d", z + i * m + j);
		}
	}
	putchar('\n');
}

void print(int* z, int n, int m, char q) {
	printf("\n%c:\n", q);
	for(int j, i = 0; i < n; ++i) {
		for(j = 0; j < m; ++j) {
			printf ("%d ", z[i * m + j]);
		}
		putchar('\n');
	}
}

void main() {
	int a[Ax][Ay], b[Bx][By], min, numi, numj;
	vvod(&a[0][0], Ax, Ay, 'a');
	vvod(&b[0][0], Bx, By, 'b');
	print(&a[0][0], Ax, Ay, 'a');
	print(&b[0][0], Bx, By, 'b');
}
Это получается что мы через указатель все вычисляем?
 

quant

yeah
Это получается что мы через указатель все вычисляем?
да, для передачи одномерного масива тоже нужны были бы указатели, z[] - это тоже *z
двумерный массив n x m представляю как одномерный размером n * m и обращаюсь с индексами i є [0,n), j є [0,m), [i + j * m] как к [j]
 
да, для передачи одномерного масива тоже нужны были бы указатели, z[] - это тоже *z
двумерный массив n x m представляю как одномерный размером n * m и обращаюсь с индексами i є [0,n), j є [0,m), [i + j * m] как к [j]


Спасибо, по написанному выше примеру получилось сделать программу, но я не пойму принципа вот этих строк, и почему они разные?
scanf("%d", z + i * m + j);
printf ("%d ", z[i * m + j]);


и написанный в цитате фрагмент [i + j * m], почему мы умножаем j*m, а в примере i*m?
 

quant

yeah
фрагмент [i + j * m], почему мы умножаем j*m, а в примере i*m?
а это я мазонул, правильно как в примере
scanf("%d", z + i * m + j); - z[10] это массив, а z это указатель на первый элемент массива, указатель на третий элемент массива будет z + 3 или &z[3], дело в том что scanf нужно передавать указатель на элемент в который считаются данные
printf ("%d ", z[i * m + j]); - а тут нужно передать не указатель а значение печатаемого
 
Зверху