- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试在结构中定义一个二维数组。使用数组效果很好:
#include <stdio.h>
#define sizeY 10
#define sizeX 10
#define LIVE 1
#define DEAD 0
typedef int TableType[sizeY][sizeX];
void printTable(TableType grid) {
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
if (grid[height][width] == LIVE) {
printf("X");
} else {
printf("-");
}
}
printf("\n");
}
printf("\n");
}
void clearTable(TableType grid) {
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
grid[height][width] = DEAD;
}
}
}
int main(void) {
TableType table;
clearTable(table);
printTable(table);
return 0;
}
但是使用结构我在使用下面的代码时遇到了错误:
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
||In function 'printTable':|
|17|error: used struct type value where scalar is required|
|17|error: expected ')' before '{' token|
In function 'clearTable':|
|32|error: expected ';' before '{' token|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
这是另一个版本的代码:
#include <stdio.h>
#define sizeY 10
#define sizeX 10
#define LIVE 1
#define DEAD 0
typedef struct {
int y;
int x;
} TableType;
void printTable(TableType grid) {
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
if (grid{height, width} == LIVE) {
printf("X");
} else {
printf("-");
}
}
printf("\n");
}
printf("\n");
}
void clearTable(TableType grid) {
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
grid{height, width} = DEAD;
}
}
}
int main(void) {
TableType table;
clearTable(table);
printTable(table);
return 0;
}
我想我没有正确使用我的结构,非常感谢任何帮助实现这一点,非常感谢!
编辑:
我更新了我的主要要求,提供了更多关于我的类(class)的细节以及我最终想要达到的目标。最终输出的是一个名为“Game Of Life”的游戏项目。
我用注释更新了下面的代码,描述了什么是 Game Of Life,具有更多功能的详细关键点和许多显示缺失内容的注释代码。很抱歉再次被阻止,但由于新要求(例如,单元格也必须是结构),我很难管理单元格的使用。
这是更新后的代码:
/*
* The Game of Life
* http://en.wikipedia.org/wiki/Conway's_Game_of_Life
*
* Key requirements :
* - Limit the size of the world to 10x10 cells
* - The world (grid) must be a struct composed by cells
* - A cell must be a struct
* - Each cell is in one of two possible states : Live or Dead
* - Any live cell with fewer than two live neighbours dies, as if caused by under-population
* - Any live cell with two or three live neighbours lives on to the next generation
* - Any live cell with more than three live neighbours dies, as if by overcrowding
* - Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction
* - Between each generation, ask if it's necessary to restart the next generation or to leave the game
* - Having dedicated function displayWorld() to display a representation of this world
* - Having dedicated function newGeneration() to generate next step of the world
* - In the function above, implement conditions based on cell's neighbors to define if each cell is alive or dead
* - Alive cells are represented by a "+"
* - Dead cells are represented by a "-"
* - New borned cells are represented by a "0"
*/
#include <stdio.h>
#define sizeY 10
#define sizeX 10
#define LIVE 1
#define DEAD 0
// A world must be a struct
typedef struct {
// @ToDo Missing: a cell must be a struct too
// Means we have a world struct that includes a cell struct
int y;
int x;
unsigned char status;
} World;
void displayWorld(World grid[], int table_size) {
int i;
for (i = 0; i < table_size; i++) {
//printf ("P(%d,%d) = ", grid[i].x, grzid[i].y);
if (i % sizeY == 0 && i != 0) {
printf("\n");
}
// Missing a third state here;
// When a cell become LIVE for the first time, it must be shown with a "0" char
if (grid[i].status == LIVE) {
printf("+");
} else {
printf("-");
}
}
printf("\n");
}
void clearTable(World grid[], int table_size) {
int i = 0;
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
grid[i].y = height;
grid[i].x = width;
grid[i].status = DEAD;
//printf ("Setting P(%d,%d) to DEAD\n", width, height);
i++;
}
}
}
int getNeighborValue(World grid[], int row, int col) {
// if (row < 0 || row >= HEIGHT
// || col < 0 || col >= WIDTH
// || table[row][col] != LIVE )
// {
// return 0;
// } else {
// return 1;
// }
}
// We count here how many neighbors a cell have
int getNeighborCount(World grid[], int row, int col) {
int neighbor = 0;
// This is not finished and will not work that way
// neighbor += getNeighborValue(grid, row - 1, col - 1);
// neighbor += getNeighborValue(grid, row - 1, col);
// neighbor += getNeighborValue(grid, row - 1, col + 1);
// neighbor += getNeighborValue(grid, row, col - 1);
// neighbor += getNeighborValue(grid, row, col + 1);
// neighbor += getNeighborValue(grid, row + 1, col - 1);
// neighbor += getNeighborValue(grid, row + 1, col);
// neighbor += getNeighborValue(grid, row + 1, col + 1);
return neighbor;
}
// Here we define which cells become LIVE OR DEAD on next generation;
// based on cell's neighbors function above
void newGeneration(World gridA[], int table_size) {
World gridB;
int neighbor, height, width;
// for (height = 0; height < table_size; height++) {
// for (width = 0; width < table_size; width++) {
// neighbor = getNeighborCount(gridA, height, width);
// if (neighbor==3) {
// gridB[height][width] = LIVE;
// } else if (neighbor == 2 && tableA[height][width] == LIFE_YES) {
// gridB[height][width] = LIVE;
// } else {
// gridB[height][width] = DEAD;
// }
// }
// }
//
// for (height = 0; height < table_size; height++) {
// for (width = 0; width < table_size; width++) {
// gridA[height][width] = gridB[height][width];
// }
// }
}
// Instead of using hardcoded loadStartData below, we ask the user to define organisms
void askUser(World grid[], int table_size) {
// int i;
// int n;
// int height, width;
//
// printf("Enter the amount of initial organisms: ");
// scanf("%d", &n);
// for (i = 0; i < n; i++) {
// printf("Enter dimensions (x y) where organism %d will live: ", i + 1);
// scanf("%d %d", &height, &width);
// grid[height][width] = LIVE;
// }
//
// displayWorld(grid);
// printf("Generation 0");
}
// Here I will define starting LIFE_YES cells data called by main()
void loadStartData(World grid[], int table_size) {
// for (i = 0; i < table_size; i++) {
// switch (grid) {
// Switch case the cells we want to set LIVE on it
// using findIndexForPoint function...
// case /* value */:
// }
// }
}
int findIndexForPoint(World grid[], int table_size, int x, int y) {
int i;
for (i = 0; i < table_size; i++) {
if (grid[i].x == x && grid[i].y == y) {
// found it
return i;
}
}
// not found, return -1;
return -1;
}
int main() {
World grid[sizeX*sizeY] = {0};
char end;
int generation = 0;
clearTable(grid, sizeX * sizeY);
// Or we load hardcoded start data or we let the user chose ...
// loadStartData(grid, sizeX * sizeY);
// askUser(grid, sizeX * sizeY)
// Keeping that example
int index = findIndexForPoint(grid,sizeX*sizeY,5,3);
if (index != -1) {
grid[index].status = LIVE;
}
displayWorld(grid, sizeX*sizeY);
do {
//newGeneration(grid);
//displayWorld(grid, sizeX * sizeY);
printf("Generation %d\n", ++generation);
printf("Press q to quit or 1 to continue: ");
scanf(" %c", &end);
} while (end != 'q') ;
return 0;
}
还是谢谢你!
最佳答案
因为这似乎是你的“作业”,所以我将使用一种非常简单的方法:
#include <stdio.h>
#define sizeY 10
#define sizeX 10
#define LIVE 1
#define DEAD 0
typedef struct {
int y;
int x;
unsigned char status;
} TableType;
void printTable(TableType grid[], int table_size) {
int i;
for (i = 0; i < table_size; i++) {
//printf ("P(%d,%d) = ", grid[i].x, grid[i].y);
if (i % sizeY == 0 && i != 0) {
printf("\n");
}
if (grid[i].status == LIVE) {
printf("X");
} else {
printf("-");
}
}
printf("\n");
}
void clearTable(TableType grid[], int table_size) {
int i = 0;
int height, width;
for (height = 0; height < sizeY; height++) {
for (width = 0; width < sizeX; width++) {
grid[i].y = height;
grid[i].x = width;
grid[i].status = DEAD;
//printf ("Setting P(%d,%d) to DEAD\n", width, height);
i++;
}
}
}
int findIndexForPoint(TableType grid[], int table_size, int x, int y) {
int i;
for (i = 0; i < table_size; i++) {
if (grid[i].x == x && grid[i].y == y) {
// found it
return i;
}
}
// not found, return -1;
return -1;
}
int main () {
TableType grid[sizeX*sizeY] = {0};
clearTable(grid, sizeX*sizeY);
// access via index but you are not sure which x,y
grid[10].status = LIVE;
// This way you know exactly which x,y
int index = findIndexForPoint (grid,sizeX*sizeY,5,3);
if (index != -1) {
grid[index].status = LIVE;
}
printTable(grid, sizeX*sizeY);
}
表格大小是 sizeX*sizeY,我们正在使用这种非常特殊的情况,我尝试重新使用您的大部分代码并假设一个 n,n 点“矩阵”。所以,基本上这意味着它没有优化,如果你弄乱了 X 和 Y 的大小,可能会出现问题。
如前所述,现在您只有一个包含 100 个点 (sizeX * sizeY) 的数组,您将在 clearTable 上对其进行初始化。此函数会将 x,y 值设置为您想要的任何值,在本例中将是您的 n x n 矩阵(其中 n = 10)。
printTable 的作用相同,但会打印值。
编译并测试它..然后根据您的需要进行调整。
输出:
----------
X---------
----------
-----X----
----------
----------
----------
----------
----------
----------
确认here
编辑:
回答您的第二个问题...请不要再这样做:/还有改进的余地。试着理解它!
/*
* The Game of Life
* http://en.wikipedia.org/wiki/Conway's_Game_of_Life
*
* Key requirements :
* - Limit the size of the world to 10x10 cells
* - The world (grid) must be a struct composed by cells
* - A cell must be a struct
* - Each cell is in one of two possible states : Live or Dead
* - Any live cell with fewer than two live neighbours dies, as if caused by under-population
* - Any live cell with two or three live neighbours lives on to the next generation
* - Any live cell with more than three live neighbours dies, as if by overcrowding
* - Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction
* - Between each generation, ask if it's necessary to restart the next generation or to leave the game
* - Having dedicated function displayWorld() to display a representation of this world
* - Having dedicated function newGeneration() to generate next step of the world
* - In the function above, implement conditions based on cell's neighbors to define if each cell is alive or dead
* - Alive cells are represented by a "+"
* - Dead cells are represented by a "-"
* - New borned cells are represented by a "0"
*/
#include <stdio.h>
#include <stdlib.h>
#define WORLD_HEIGHT 10
#define WORLD_WIDTH 10
typedef enum {
CELL_STATE_INVALID=-1,
CELL_STATE_DEAD = 0,
CELL_STATE_LIVE = 1,
CELL_STATE_NEWBORN= 2,
CELL_N_STATES
} CellStateType;
typedef struct _cell {
// @ToDo Missing: a cell must be a struct too
// Means we have a world struct that includes a cell struct
int y;
int x;
unsigned char status;
} Cell;
typedef struct _world {
int width;
int height;
int generation;
Cell *grid;
} World;
// helper function to find for x,y cell on cell array
int findIndexForCell(World world, int x, int y) {
int i;
for (i = 0; i < world.width * world.height; i++) {
if (world.grid[i].x == x && world.grid[i].y == y) {
// found it, return indice
return i;
}
}
// not found, return -1;
return -1;
}
// function will get cell status for given x, y
// returns invalid status if x,y outside world dimensions
CellStateType getCellStatus(World world, int x, int y) {
int index;
index = findIndexForCell(world, x, y);
if (index == -1) {
return CELL_STATE_INVALID;
} else {
return world.grid[index].status;
}
}
// function will set cell status and return true or false
// if able to set status or not.
int setCellStatus(World world, int x, int y, CellStateType status) {
int index;
index = findIndexForCell(world, x, y);
if (index == -1) {
return 0;
} else {
world.grid[index].status = status;
return 1;
}
}
// Create a new world
World createWorld (int width, int height) {
World world;
world.width = width;
world.height = height;
world.generation = 0;
// Content of grid is not initialized
world.grid = (Cell *) malloc (sizeof(Cell) * (world.width * world.height));
return world;
}
void displayWorld(World world) {
int i;
int size_world = world.width * world.height;
for (i = 0; i < size_world; i++) {
if (i % world.width == 0 && i != 0) {
printf("\n");
}
// Missing a third state here;
// When a cell become LIVE for the first time, it must be shown with a "0" char
switch (world.grid[i].status) {
case CELL_STATE_NEWBORN:
printf("0");
break;
case CELL_STATE_DEAD:
printf("-");
break;
case CELL_STATE_LIVE:
printf("+");
break;
default:
printf("?");
break;
}
}
printf("\n");
}
void initWorld(World world) {
int x,y;
int i = 0;
world.generation = 0;
for (y = 0; y < world.height; y++) {
for (x = 0; x < world.width; x++) {
world.grid[i].y = y;
world.grid[i].x = x;
world.grid[i].status = CELL_STATE_DEAD;
i++;
}
}
}
int getNeighborValue(World world, int row, int col) {
if (row < 0 || row >= world.height
|| col < 0 || col >= world.width
|| getCellStatus(world, row, col) < CELL_STATE_LIVE)
{
return CELL_STATE_DEAD;
} else {
return CELL_STATE_LIVE;
}
}
// We count here how many neighbors a cell have
int getNeighborCount(World world, int row, int col) {
int neighbor = 0;
// This is not finished and will not work that way
neighbor += getNeighborValue(world, row - 1, col - 1);
neighbor += getNeighborValue(world, row - 1, col);
neighbor += getNeighborValue(world, row - 1, col + 1);
neighbor += getNeighborValue(world, row, col - 1);
neighbor += getNeighborValue(world, row, col + 1);
neighbor += getNeighborValue(world, row + 1, col - 1);
neighbor += getNeighborValue(world, row + 1, col);
neighbor += getNeighborValue(world, row + 1, col + 1);
return neighbor;
}
// Here we define which cells become LIVE OR DEAD on next generation;
// based on cell's neighbors function above
World newGeneration(World world) {
World temp;
temp = createWorld(world.width, world.height);
initWorld(temp);
int neighbor, height, width;
for (height = 0; height < world.height; height++) {
for (width = 0; width < world.width; width++) {
neighbor = getNeighborCount(world, width, height);
if (getCellStatus(world, width, height) >= CELL_STATE_LIVE) {
if (neighbor == 2 || neighbor == 3) {
setCellStatus(temp, width, height, CELL_STATE_LIVE);
} else {
setCellStatus(temp, width, height, CELL_STATE_DEAD);
}
} else {
if (neighbor == 3) {
setCellStatus(temp, width, height, CELL_STATE_NEWBORN);
}
}
}
}
return temp;
}
// Instead of using hardcoded loadStartData below, we ask the user to define organisms
void askUser(World world) {
int i;
int n;
int height, width;
printf("Enter the amount of initial organisms: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
do {
printf("Enter dimensions (x y) where organism %d will live: ", i + 1);
scanf("%d %d", &width, &height);
} while (setCellStatus(world, width, height, CELL_STATE_LIVE) == 0);
}
}
// Here I will define starting LIFE_YES cells data called by main()
void loadStartData(World world) {
// Let's check the Beacon:
// **
// **
// **
// **
setCellStatus(world, 2,2, CELL_STATE_LIVE);
setCellStatus(world, 3,2, CELL_STATE_LIVE);
setCellStatus(world, 2,3, CELL_STATE_LIVE);
setCellStatus(world, 3,3, CELL_STATE_LIVE);
setCellStatus(world, 4,4, CELL_STATE_LIVE);
setCellStatus(world, 5,4, CELL_STATE_LIVE);
setCellStatus(world, 4,5, CELL_STATE_LIVE);
setCellStatus(world, 5,5, CELL_STATE_LIVE);
}
int main() {
char end;
World myworld;
int generation = 0;
myworld = createWorld(WORLD_WIDTH, WORLD_HEIGHT);
initWorld(myworld);
// Or we load hardcoded start data or we let the user chose ...
loadStartData(myworld);
//askUser(myworld);
while (end != 'q') {
displayWorld(myworld);
myworld = newGeneration(myworld);
printf("Generation %d\n", ++generation);
printf("Press q to quit or 1 to continue: ");
scanf(" %c", &end);
}
return 0;
}
关于c - 在结构中定义二维网格并访问单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225966/
我试图要求 test/unit 的新版本(即不是与 ruby 捆绑的版本) .根据 instructions我用 gem i test-unit 安装它.但是现在当我需要 test/unit我似乎
简短版本是: 我有一个 systemd 单元,我想在调用时检查脚本的返回代码: systemctl status service.service 长版本:我有一个 lsb init 脚本正是这样做的,
我正在使用反射动态创建一个类的实例,这工作正常,除非尝试通过单元测试执行此操作 - 我使用的是 MS 测试框架。 我收到熟悉的错误:“无法加载文件或程序集‘Assy’或其依赖项之一。系统找不到指定的文
我想知道测试网站“界面功能”的最佳实践是什么。 我对哪些方法可用于测试界面和动态生成的内容感兴趣。特别是,我很难弄清楚是否可以为需要用户交互的操作创建自动化测试,或者这是否只是浪费时间,我应该让一些
我有一个简单的 Python 服务,其中有一个无限执行某些操作的循环。在各种信号上,sys.exit(0) 被调用,这导致 SystemExit 被引发,然后如果可以的话应该进行一些清理。 在测试中,
我正在使用 OpenCV 2.4.2 这是 OpenCV 文档中的引文 C++: void HoughLinesP(InputArray image, OutputArray lines, doubl
忙于 C# 中的自动化测试用例,我们需要在每次测试后恢复数据库快照。问题是,当运行多个测试时它会失败,因为“其他用户正在使用数据库时无法更改数据库状态。” 我们使用 SqlConnection.Cle
我阅读了 C# 规范并用谷歌搜索了它,但一无所获。 我 99% 肯定 C# 中没有像单元命名空间指令这样的功能,但问题是:为什么?是否有惯用或技术原因? 这很方便,尤其是当我们的大部分文件都由单个命名
我目前正在尝试向我的应用程序(一个非常老的项目......评论说 iOS 2.0)添加单元测试(精确的应用程序测试)并且总是偶然发现 undefined symbols for architectur
我正在使用Delphi 7,并且有一个新单元要在我的项目中使用。我已经编译了新的。当我尝试通过将其添加到uses子句在项目中使用此单元时,出现错误,提示未找到.dcu文件。我还尝试将文件的完整路径放在
场景:我需要编写一个复杂的nHibernate查询,该查询将返回预计的DTO,但是我想使用TDD方法。该方法如下所示: public PrintDTO GetUsersForPrinting(int
您可以通过运行以下命令在事件 html 设置中显示 Jupyter 笔记本: $ jupyter nbconvert untitled.ipynb --to slides --post serve 有
如何在一个网站上拥有多个 AdSense 单元? Google 提供的唯一代码是按单位计算的。 (adsbygoogle = window.adsbygoogle || []).push({})
我刚刚开始为大量代码编写测试。有很多类依赖于文件系统,即读取 CSV 文件、读/写配置文件等。 当前测试文件存储在项目(这是一个 Maven2 项目)的 test 目录中,但由于多种原因该目录并不总是
我对 TDD 还很陌生,在单元测试方面也不是很老练,所以才有这个问题。我有这个用 PHP 编写的遗留函数 function foo(){ x = bar(); y = baz();
我创建了一个程序,在 Swing 窗口的一侧显示结果过滤选项,但默认情况下它们水平相邻显示,这浪费了我在 BorderLayout 的西侧分配的空间。我可以在构造函数或添加语句中传递任何内容来将它们堆
标题不好的借口:如果有人能更好地描述它,请做。 我有一个 WeakList类,它“基本上”是一个 List> (虽然不是字面意义上的派生自列表,但它应该对用户完全透明)。 现在的基本思想是“如果引用的
我正在尝试在 UITableView 上添加两个原型(prototype)单元。但是,我不知道如何验证是否能够为每个原型(prototype)“返回”正确的单元格。你们能帮我一下吗? func ta
我正在使用 CloudKit 作为数据库创建一个简单的待办事项列表应用程序。目前我可以添加和删除对象,但对编辑对象感到困惑。 编辑项目 Controller protocol EditItemCont
我正在针对以下任务训练 RNN:给定一个包含 30 个单词的序列,然后将该序列分类为二进制类。 在我的网络中拥有超过 30 个单元(LSTM、GRU 或普通 RNN)有好处吗?我在网上看到过很多例子,
我是一名优秀的程序员,十分优秀!